2010-01-07 7 views
1

Je déclare un singleton sur une DLL d'extension MFC, comme ceci:Singleton extension MFC DLL

 
//header file: SingleTon.h 
class AFX_EXT_CLASS CMySingleton 
{ 
public: 
    static CMySingleton* Instance() 
    { 
    if(!singleton) 
     singleton = new CMySingleton(); 
    return singleton; 
    } 

    int a; 

// Other non-static member functions 
private: 
    CMySingleton() {};         // Private constructor 
    CMySingleton(const CMySingleton&);     // Prevent copy-construction 
    CMySingleton& operator=(const CMySingleton&);  // Prevent assignment 
    virtual ~CMySingleton() {}; 

    static CMySingleton* singleton; 
}; 

And in a cpp file I code the following line: 

CMySingleton* CMySingleton::singleton = NULL; 

Code 2:

 
CMySingleton *a; 

a = CMySingleton::Instance(); 

Le problème est quand je code "Code 2" dans un régulier dll, tout fonctionne très bien, mais quand je code "code 2" dans un autre DLL d'extension MFC donne une erreur:

 
unresolved external symbol "private: static class CMySingleton* CMySingleton::singleton" ([email protected]@@[email protected]) 

Je vérifie correctement tous les dependenci es, via les dépendances du projet.

Une idée?

Répondre

1

Le problème est dans la macro AFX_EXT_CLASS.

#ifdef _AFXEXT 
    #define AFX_EXT_CLASS  __declspec(dllexport) 
#else 
    #define AFX_EXT_CLASS  __declspec(dllimport) 
#endif 

dll Extension définit _AFXEXT et votre classe est exportée, et l'application principale (ou une dll régulière) ne définit pas il est donc importé. Mais votre seconde extension dll définit aussi _AFXEXT et votre déclaration de classe utilise dllimport au lieu de dllexport et vous obtenez une erreur de linker. La solution est de créer votre propre macro pour les DLLs et les utiliser au lieu de AFX_EXT_CLASS:

#ifdef EXTENSION_ONE 
    #define EXT_CLASS_ONE  __declspec(dllexport) 
#else 
    #define EXT_CLASS_ONE  __declspec(dllimport) 
#endif 

Créer EXTENSION_TWO et EXT_CLASS_TWO pour votre deuxième dll. Définissez EXTENSION_ONE uniquement dans votre premier projet de DLL d'extension et EXTENSION_TWO uniquement dans votre deuxième projet de DLL d'extension.

+0

Grande réponse !!. –