Bonjour,
Il parait qu'il existe un pragma ou autre chose qui permet d'obliger le linker à intégrer une ou toutes les classes d'une librairie.
Vous en avez entendu parler d'un truc dans le style ?
Bonjour,
Il parait qu'il existe un pragma ou autre chose qui permet d'obliger le linker à intégrer une ou toutes les classes d'une librairie.
Vous en avez entendu parler d'un truc dans le style ?
Fautdrait préciser ce que tu entends par inclure.
Y'a l'option /INCLUDE
http://msdn2.microsoft.com/en-us/library/2s3hwbhs(en-US,VS.80).aspx
mais je ne suis pas sûr que ce soit ce dont tu parles. Peut être fais-tu allusion à /OPT:NOREF qui désactive l'élimination du code compilé non référencé.
Ba en fait, j'ai un code un peu particulier.
Mon programme crée des objets sans savoir ce qu'il crée. A partir d'un nom ( Chaine de caractères ), il scanne la liste des RuntimeClass pour trouver celle correspondant à la chaine de caractères. Dès qu'il la trouve il lance CreateObject de la RuntimeClass.
Le compilateur ne sait qu'il doit linké la class A mais moi je sais qu'il doit le faire. Donc je veux dire au compilateur d'ajouter la class A même si lui pense qu'elle ne sert pas.
Tu crois que c'est possible. Mais moi je voudrais que ce soit fait uniquement pour la class A et pas pour la totalité du programme.
--------------------------
Effectivement j'ai testé
Mais forcement c'était trop simple et ça n'a pas fonctionné. Car cette commande permet uniquement d'inclure un composant donc, si je ne me trompe pas, une méthode par exemple et pas une classe entière.
Code : Sélectionner tout - Visualiser dans une fenêtre à part #pragma comment ( linker "/include CMyClass" )
A moins que si j'utilise ce pragma en mettant par exemple le constructeur, le linker ajoutera la classe entière.
A suivre ...
Ce que tu décris n'est pas possible en C++ standard natif. Précises comment tu scannes les runtime class.
Quelque part, le compilateur doit obligatoirement compiler un code qui instancie la classe, donc elle est référencée, donc il ne la vire pas. Car sinon, comment fais-tu pour appeler le constructeur de la classe ?
Bon alors !!!
Voici mon code d'appel
La macro CREATE_OBJECT lance une fonction récupérant la liste des RuntimeClass grâce à AfxGetModuleState ( )->m_classList.
Code : Sélectionner tout - Visualiser dans une fenêtre à part CObject * pObj = CREATE_OBJECT ( "CMyClass" );
Ensuite, on fait une boucle sur cette liste pour récupérer tous les RuntimeClass.
On fait un petit
Si cette condition est vrai alors je fais un
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ( "CMyClass" == pRTClass->m_pszClassName )
Et là splendeur, j'obtiens un CMyClass.
Code : Sélectionner tout - Visualiser dans une fenêtre à part pRTClass->CreateObject ( )
Il faut bien evidement que CMyClass hérite directement ou indirectement de CObject avec un beau DECLARE_OBJECT et tout ce qui va avec.
Voici le lien pour le code de ce principe
http://www.codeguru.com/Cpp/Cpp/cpp_...icle.php/c4047
Ce principe là fonctionne très bien. Mais dans le cas où, je n'utilise que mes classes abstraitre pour fonctionner, toutes mes classes filles ne sont pas instanciées directement donc le linker ne les détecte pas Donc ne les link pas.
Et vu qu'il ne les link pas, elles ne sont pas dans la liste de RunTimeClass. Donc je n'ai pas d'objet créé.
en fait, j'ai dû paré au plus précés. Alors j'ai créé dans un classe un tableau statique de CRuntimeClass.
Et j'y met toutes les RuntimeClass des classes qui je sais seront utilisée comme je le veux.
C'est le seul moyen. Ca va ca aurait pu être pire.
Ok, donc il y' a bien un code de création quelque part ( CreateObject() ) et une référence autre part (que AfxGetModuleState() interroge).
Reste à s'assurer que ta classe figure bien dans cette référence, mais comme je ne connais pas ce mécanisme MFC...
Cependant, dans le lien donné, la macro IMPLEMENT_SERIAL semble jouer ce rôle.
En fait pour être sur d'avoir j'ai créer un tableau static dans la classe la plus importante de la lib contenant tous les RUNTIME_CLASS dont je suis sur de créer dynamiquement et qui risque de ne pas être ajouter lors du link.
Cette méthode fonctionne bien même si elle n'est pas propre.
Mais on fait ce qu'on peut.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager