[DLL] Methodes de classe et dll
Salut j'ai une question concerant les dll, je voudrait creer une dll avec dedans une classe avec que des methodes statics, une sorte de bibliotheque en fait.
Ma question est : coment utiliser les methodes de cette classe par la suite.
Code:
1 2
| LoadLibrary(maDll.dll);
MaClasse::maFonction(); |
ça marche ???
La dll ne doit rien exporter ?
Pardon je suis un boulet....
Les codes d'export de classe exporte les classes et pas les fonctions classes...
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
#ifdef PICTUREMODIFYER_EXPORTS
#define PICTUREMODIFYER_API __declspec(dllexport)
#else
#define PICTUREMODIFYER_API __declspec(dllimport)
#endif
// This class is exported from the PictureModifyer.dll
class PICTUREMODIFYER_API CPictureModifyer {
public:
static maFonction();
}; |
pardon pour le dérangement, j'apprends a lire.... :oops:
Chargement implicite de dll
J'ai un leger probleme avec mes dll.
J'utilise 4 dll qui sont chargées de manière "DELAY" et le probleme est que quand le linker charge la DLL il ne fait apparement pas appel a dllMain. (j'ai tracer le truc en debbug)
Ma question est donc la suivante :
1- Ou est specifier l'option d chargement différer ?? (faut il justement poser une option pour ne pas avoir de chargement différé ?)
2-Avec une chargement différé qui est quand meme plus mieux bien, comment faire pour quand meme passer dasn le dllMAin
au cas ou voici le code de ma dll
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
BOOL APIENTRY DllMain( HANDLE , DWORD ul_reason_for_call,LPVOID)
{
#ifdef DEBUG
UNICODE_debugTrace(TEXT("Picture manager : DllMain"));
#endif
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
#ifdef DEBUG
UNICODE_debugTrace(TEXT("Picture manager : DLL_PROCESS_ATTACH:"));
#endif
break;
case DLL_THREAD_ATTACH:
#ifdef DEBUG
UNICODE_debugTrace(TEXT("Picture manager : DLL_THREAD_ATTACH"));
#endif
break;
case DLL_THREAD_DETACH:
#ifdef DEBUG
UNICODE_debugTrace(TEXT("Picture manager : DLL_THREAD_DETACH"));
#endif
break;
case DLL_PROCESS_DETACH:
#ifdef DEBUG
UNICODE_debugTrace(TEXT("Picture manager : DLL_PROCESS_DETACH"));
#endif
break;
}
return TRUE;
}
CPictureManager::sayHello()//methode static de ma classe
{
MessageBox(NULL,TEXT("kikou"), TEXT("Error"),MB_ICONERROR);
} |
utilisé comme ça.
Code:
1 2
| CPictureManager::sayHello();
//et ce sans loadLibrary explicite |
le truc c'est que quad le preogramme quite il passe par dllMain et affiche la trace 8O
je suis convaincu n'en jetez plus !
Ok ça me conforte dans mon idée je vais me debrouiller autrement !....
A y est j'ai fait avec de l'appel implicite (c'est vrai c'est bien) Alors voilà je test une classe de base toute de base qui dit bonjour et c'est tout, la methode est static pas de problem ça marche...
Ensuite je retrousse me tites maches et je passe à mon vrai truc.
Un singleton manager de fichier. Je li bien comme y faut la faq le forum et hop je choisi le singleton le plus simple que voici
.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class PICTUREMANAGER_API CPictureManager
{
private:
int m_i;
static CPictureManager * m_p;
CPictureManager();
~CPictureManager();
protected:
public:
void SetValue( int iValue );
int GetValue();
static CPictureManager * GetInstance( void );
static Kill();
static sayHello();
}; |
.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
CPictureManager::~CPictureManager()
{
}
CPictureManager::CPictureManager()
{
}
CPictureManager::sayHello()
{
MessageBox(NULL,TEXT("Hello you"), TEXT("Info."),MB_ICONINFORMATION);
}
CPictureManager* CPictureManager::GetInstance()
{
if( m_p == 0 )
{
#ifdef DEBUG
UNICODE_debugTrace(TEXT("Creation of PictureManager"));
#endif
m_p = new CPictureManager();
}
else
{
#ifdef DEBUG
UNICODE_debugTrace(TEXT("PictureManager allready exist here is the handle"));
#endif
}
return m_p;
}
CPictureManager::Kill()
{
if( m_p != 0 )
{
delete m_p;
m_p = 0;
#ifdef DEBUG
UNICODE_debugTrace(TEXT("PictureManager has been killed"));
#endif
}
}
void CPictureManager::SetValue( int i )
{
this->m_i = i;
}
int CPictureManager::GetValue()
{
return this->m_i;
} |
Normalemnt ce truc fonctionne, le truc c'est qeu c'est que le projet veut mem pas compiler !
Citation:
Creating library .././bin/debug/emulator/PictureManager.lib and object .././bin/debug/emulator/PictureManager.exp
PictureManager.obj : error LNK2001: unresolved external symbol "private: static class CPictureManager * CPictureManager::m_p" (?m_p@CPictureManager@@0PAV1@A)
.././bin/debug/emulator/PictureManager.dll : fatal error LNK1120: 1 unresolved externals
ALors vienne deux question, bien sur pourquoi que ça marche pô et deuxiemement tous les singleton que j'ai vu sont dans le meme espace memoire que le prog, c'est super cool pour fair l'init du pointeur sur l'instance mais avec une dll comment on fait ça ???