IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[VC6] Obliger le linker à intégrer toutes les classes


Sujet :

MFC

  1. #1
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut [VC6] Obliger le linker à intégrer toutes les classes
    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 ?

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    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é.

  3. #3
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    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é
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma comment ( linker "/include CMyClass" )
    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.

    A moins que si j'utilise ce pragma en mettant par exemple le constructeur, le linker ajoutera la classe entière.

    A suivre ...

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    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 ?

  5. #5
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Bon alors !!!

    Voici mon code d'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CObject * pObj = CREATE_OBJECT  ( "CMyClass" );
    La macro CREATE_OBJECT lance une fonction récupérant la liste des RuntimeClass grâce à AfxGetModuleState ( )->m_classList.
    Ensuite, on fait une boucle sur cette liste pour récupérer tous les RuntimeClass.
    On fait un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( "CMyClass" == pRTClass->m_pszClassName )
    Si cette condition est vrai alors je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pRTClass->CreateObject ( )
    Et là splendeur, j'obtiens un CMyClass.
    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éé.

  6. #6
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    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.

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    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.

  8. #8
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [D7][Infos système] Comment lister toutes les classes WMI ?
    Par phplive dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 03/05/2006, 23h51
  2. Réponses: 1
    Dernier message: 06/03/2006, 14h16
  3. Existe t il une doc de toutes les classes dites standard?
    Par CnD dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 27/11/2005, 11h53
  4. Réponses: 2
    Dernier message: 17/06/2005, 23h03
  5. [Reflection] Obtenir toutes les classes implémentant une interface
    Par Pill_S dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 20/04/2005, 16h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo