Bonjour,
J'ai codé en C une petite DLL qui a une fonction qui communique avec un driver spécifique.
L'une de ces fonctions de la DLL ne prends aucun paramètre.
Voici son prototype :
Lorsque je charge ma DLL dans du code Python, l'appel se fait tout simplement comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part void DLL_EXPORT initMuxyLight()
En revanche, cela a l'air d'être plus compliqué en C, voici le code pour charger une DLL et appeler une fonction (notez en C qu'il faut initialisé un type de pointeur de fonction) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 dlltest = ctypes.CDLL("canInterfaceDll.dll") dlltest.initMuxyLight()
Comme la fonction initMuxyLight() ne prends aucun paramètre, j'ai écrit funcADDR() de cette manière ci. Or, lorsque je fais tourner le programme, le compilateur me dit qu'il lui manque deux paramètres :
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 #include <Windows.h> #include <stdio.h> typedef UINT (CALLBACK* FUNCADDR)(DWORD,UINT); int main (int argc, char *argv[]) { HMODULE libHandle; if((libHandle = LoadLibrary(TEXT("C:/Users/nassera/Desktop/testDLL/canInterfaceDll/bin/Debug/canInterfaceDLL"))) == NULL){ puts("load failed lol"); system("pause"); }else{ puts("dll is loaded OK"); system("pause"); FUNCADDR funcADDR; funcADDR = (FUNCADDR) GetProcAddress(libHandle,"initMuxyLight");//adress of the function of muxy light initialisation if(!funcADDR){ FreeLibrary(libHandle); return -1; }else{ printf("%04x\n",funcADDR); system("pause"); funcADDR(); } }Cela est étrange, car comme nous l'avions vu, la fonction de la DLL ne prends aucun paramètres!67, 22 error: too few arguments to function call, expected 2, have 0
Du coup, j'ai passé deux paramètres aléatoirement, du genreet là ça marche!
Code : Sélectionner tout - Visualiser dans une fenêtre à part funcADDR(445,54);
Enfin, j'aimerais bien savoir pourquoi le programme demande deux paramètres alors qu'il ne devrait pas en avoir (j'ai également testé avec une fonction qui demande un unique paramètre et c'est exactement le même scénario).
En attendant vos réponses,
Merci
Partager