Bonjour,
J'ai besoin d'appeler une Fonction Global getter à partir d'une DLL
Comment dire au Linker que la fonction est à aller chercher dans le main?
Merci de répondre: ce sera![]()
Bonjour,
J'ai besoin d'appeler une Fonction Global getter à partir d'une DLL
Comment dire au Linker que la fonction est à aller chercher dans le main?
Merci de répondre: ce sera![]()
ci joint exemple de déclaration à mettre dans ton .h:
tu dois aussi lier ta librairie en mettant le xxx.LIB correspondant à ta DLL xxx.DLL dans ton code ou faire un #pragma link "xxx.lib" il me semble
Code : Sélectionner tout - Visualiser dans une fenêtre à part extern "C" __declspec(dllimport) int __stdcall Global_getter(char *Data, int *Len, char *Test);
il y a des tutos la dessus il me semble.
ça c'est le plus simple mode statique, il y a aussi le chargement et déchargement dynamique ex:
regarde ici:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 HINSTANCE hinstDLL; hinstDLL=LoadLibrary("xxx.dll" ); ... FreeLibrary(hinstDLL);
http://lfe.developpez.com/DLL/#L3
Salut,
Si j'ai bien compris, c'est la fonction de la DLL qui doit rappeler une fonction de ton programme principal?
Si c'est ça, alors il faut que tu définisses la signature de cette fonction de callback dans ta DLL et définir un paramètre dans ta DLL pour lui passer l'adresse de la fonction de callback.
dans la DLL:
Dans ton main:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 // Définition de la signature que doit avoir la fonction de callback // appelé par la DLL (ici accepte un int comme paramètre et ne // retourne rien) typedef void (*myCallbackFunctionType)(int toto); // La fonction de la DLL qui appelera le callback du main void PACKAGE MyDLLFunction(myCallbackFunctionType callback) { int a=12; // Appel de la fonction de callback (attention, le parametre est un // pointeur qui peut être NULL) if (callback) { callback(a); // l'appel proprement dit } }
Maintenant tu peux avoir à ajouter des __closure si ta fonction de callback est dans une classe et des __fastcall si tu veux (pas obligatoire) à tes signatures de fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 // Définition de la fonction de callback qui doit avoir la même // signature que celui déterminé dans la DLL void MyCallback(int value) { cerr<<"Hello, la valeur est: "<<value<<endl; } // Appel de la fonction de la DLL (Fbartolo t'a indiqué comment // appeler la DLL) void main(int argc, char *argv[]) { // Charger la DLL HINSTANCE hinstDLL; hinstDLL=LoadLibrary("Project1.dll")); // Définition des types typedef void (*myCallbackFunctionType)(int toto); typedef void (*MyDLLFunctionType)(myCallbackFunctionType); // Trouver l'adresse de la fonction dans la DLL if (hinstDLL) { MyDLLFunctionType dllFunction=GetProcAddress(hinstDLL,"MyDLLFunction"); // Appeler la fonction avec son callback if (dllFunction) { dllFunction(&MyCallback); } } }
Je n'ai pas testé ce code et il peut donc contenir encore quelques erreurs, dis-moi si ça ne marche pas
Oups désolé, j'avais pô vu que c'était un call back qui était demandé, effectivent l'idée est de fournir à la DLL l'adresse mémoire de ta fonction avec le bon prototype connu de ton main et de la DLL.
Bonjour
D'abord, je vous remercie pour vos réponses bien documentées.
Ensuite je me pose la question de d'écriture des exemples: est ce du C ou du C++, prend t'on les mêmes méthodes dans les deux cas.
merci de m'apporter ces précision, ce sera![]()
Salut,
J'ai fait un exemple en C car tu parlais d'aller dans le main. Maintenant, pour les accès à la DLL, c'est la même chose en C++. Il y a juste une différence dans la signature de la fonction de callback si la fonction se trouve dans une classe: tu doit ajouter le mot-clé "__closure" comme ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 typedef void (__closure *myCallbackFunctionType)(int toto);
Bonjour,
Merci à tous pour l'ensemble des réponses qui vont me faire réussir.
Je ne peux pas la tester aujourd'hui car j'ai d'autres priorités.
Je conserve l'accès à toutes ces informations et je reviendrai vers le site pour documenter la solution qui marchera.
Je met résolu, car je pense que les réponses sont suffisantes dans l'état et je fournirai la solution implémentée plus tard.
Partager