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" :
La fonction LoadFunction étant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 //HEADER (dans une classe) typedef void* (__stdcall *DllPtyType)(void); DllPtyType AuthorFc; // FICHIER CPP AuthorFc = LoadFunction<DllPtyType>("GetAuthor");
(j'ai enlevé le check sur "Func" puisque je le gère ailleurs). Et la fonction GetAuthor :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
(g_Author étant de type string). Puis je l'utilise comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 extern "C" __declspec(dllexport) void* GetAuthor() { return (void*)(&g_Author); }
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 ?).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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";
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 :
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...".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 typedef string (__stdcall *DllPtyType)(void);
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
Partager