Passage d'objet dans une DLL
Bonjour,
Dans mon programme, je suis en train de créer un système de plugins. Histoire de vérifier que ça fonctionne, j'ai codé quelques fonctions dans ma DLL genre "GetAuthor" :
Code:
1 2 3 4 5 6 7
|
//HEADER (dans une classe)
typedef void* (__stdcall *DllPtyType)(void);
DllPtyType AuthorFc;
// FICHIER CPP
AuthorFc = LoadFunction<DllPtyType>("GetAuthor"); |
La fonction LoadFunction étant :
Code:
1 2 3 4 5 6 7 8
|
template<class T>
T LoadFunction(const string& _FuncName)
{
void* Func = GetProcAddress(m_Library, _FuncName.c_str() );
return reinterpret_cast<T>(Func);
} |
(j'ai enlevé le check sur "Func" puisque je le gère ailleurs). Et la fonction GetAuthor :
Code:
1 2 3 4 5
|
extern "C" __declspec(dllexport) void* GetAuthor()
{
return (void*)(&g_Author);
} |
(g_Author étant de type string). Puis je l'utilise comme suit :
Code:
1 2 3 4 5 6 7 8 9 10
|
void* l_Ret;
if( AuthorFc )
{
l_Ret = AuthorFc();
memcpy((void*)&m_Author,l_Ret,sizeof(string));
}
else
m_Author = "Not specified"; |
Ca fonctionne... presque. Dans la suite du programme, j'obtiens bien l'auteur. Par contre, j'ai un joli plantage (type segfault) à la fermeture. Je ne vois pas du tout d'où il vient (enfin... le memcpy qui passe mal ?).
Et puis ce code est relativement moche : je suis obligé de passer par un castage tout moche en void* à la C. En effet, si je définie DllPtyType comme :
Code:
1 2
|
typedef string (__stdcall *DllPtyType)(void); |
où que je passe un argument de type string (mais, plus généralement, un quelconque type non standard du C/C++), le code compile, mais plante à l'exécution en me disant que le registre "ESP was not saved properly...".
Pourquoi ? Alors que je reste définitivement en C++ partout, je ne peux pas passer d'objet autrement que par un cast "sauvage" en void* ?
merci
Cordialement