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 : 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");
La fonction LoadFunction étant :
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);
	}
(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
 
extern "C" __declspec(dllexport) void* GetAuthor()
{
	return (void*)(&g_Author);
}
(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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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