[win32] dll, import et calling convention...

dll, import et calling convention... [win32] - C - Programmation

Marsh Posté le 29-10-2003 à 16:14:05    

J'essaie d'appeler une fonction exportée par une dll de windows :

Code :
  1. typedef void (CALLBACK *LPFNDLLFUNC)(LPCSTR);
  2. LPFNDLLFUNC functionPtr = NULL;
  3. functionPtr = (LPFNDLLFUNC)GetProcAddress(hDll, "Control_RunDLL" );
  4. if (functionPtr == NULL) {
  5.     MessageBox(NULL, "error getting proc address", "error", MB_OK | MB_ICONERROR);
  6. } else {
  7.     functionPtr(path);
  8. }


En mode debug, je me prends un message disant "The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention."
En mode release, l'appel passe, mais ne fait pas ce que j'attends de lui, et je me prends une access violation _après_.
 
J'ai essayé en changeant la convention d'appel dans le typedef, sans effet.
 
Voila là ou ca devient drôle : la fonction que je veux appeler est dans shell32.dll. Elle n'est bien sur pas documentée par M$, et donc je ne suis sur ni du type de retour, ni du nombre et du type des arguments...
La seule chose que je sais, c'est qu'en lançant un rundll32 shell32.dll,Control_RunDLL "appwiz.cpl" e, ligne de commande, ça marche.
Quelqu'un a une idée, où je suis en train de tenter un truc impossible ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 29-10-2003 à 16:14:05   

Reply

Marsh Posté le 29-10-2003 à 16:28:27    

Ca peut oeut être t'aider:
http://delphi.about.com/library/code/ncaa062403a.htm


---------------
Le Tyran
Reply

Marsh Posté le 29-10-2003 à 16:33:17    

effectivement :jap:


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 29-10-2003 à 16:35:05    

ça dépend de la convention d'appel de la fonction de la DLL, normalement elle doit être déclarée comme ceci :
 
extern "C" __declspec( dllexport ) int __stdcall fonction()
 
en tout cas, moi je fais comme ça et j'ai jamais eu de pépin


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 29-10-2003 à 16:43:42    

Le problème c'es justement que je n'ai aucune idée de la façon dont est déclarée la fonction.
 
Bon donc j'ai fais ça :

Code :
  1. typedef void (__stdcall *LPFNDLLFUNC)(HWND, HINSTANCE, LPCSTR, int);
  2. LPFNDLLFUNC functionPtr = NULL;
  3. functionPtr = (LPFNDLLFUNC)GetProcAddress(hDll, "Control_RunDLL" );
  4. if (functionPtr == NULL) {
  5.     MessageBox(NULL, "error getting proc address", "error", MB_OK | MB_ICONERROR);
  6. } else {
  7.     functionPtr(NULL, hInstance, "appwiz.cpl", SW_SHOW);
  8. }


Plus de message d'erreur (c'est deja ça), mais il ne se passe rien. Normalement c'est sensé ouvrir la fenêtre "ajout/supression de programmes", et là nada :(


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 29-10-2003 à 16:49:11    

regarde ici, j'avais donné une explication de l'utilisation de GetProcAdress()
http://forum.hardware.fr/forum2.ph [...] 98#t467225
 
edit: je suis sur que ça vient du fait que t'as pas encadré ton pointeur de fonction avec une parenthèse :
 
(functionPtr)(NULL, hInstance, "appwiz.cpl", SW_SHOW);


Message édité par Harkonnen le 29-10-2003 à 16:54:49

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 29-10-2003 à 17:00:07    

Harkonnen a écrit :

regarde ici, j'avais donné une explication de l'utilisation de GetProcAdress()
http://forum.hardware.fr/forum2.ph [...] 98#t467225
 
edit: je suis sur que ça vient du fait que t'as pas encadré ton pointeur de fonction avec une parenthèse :
 
(functionPtr)(NULL, hInstance, "appwiz.cpl", SW_SHOW);


Pour le fonctionnement de GetProcAdress(), j'avais à peu près compris. C'est au niveau de la syntaxe et des pointeurs de fonction que j'ai du mal.
Et avec les parenthèses ça marche pas plus. Je me demande si j'utilise la bonne fonction ; shell32.dll exporte aussi une Control_RunDLLA... Pourtant avec rundll32 ça passe comme ça...


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 29-10-2003 à 17:26:20    

C'est bon ça marche ! En fait c'était à moi de créer une fenêtre, et de passer le hwnd de cette fenêtre à la fonction. Ca ouvre des perspectives d'ailleurs ; on peut intégrer les éléments du panneau de config dans une application...


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 30-10-2003 à 08:50:44    

R3g a écrit :

C'est bon ça marche ! En fait c'était à moi de créer une fenêtre, et de passer le hwnd de cette fenêtre à la fonction. Ca ouvre des perspectives d'ailleurs ; on peut intégrer les éléments du panneau de config dans une application...


 
Ben ouai, c ce qui était dit sur la page que je t'ai fillé il me semble.
 
EDIT: Y aaurait pas plus simple, avec une interface COM par exemple?


Message édité par LetoII le 30-10-2003 à 08:51:09

---------------
Le Tyran
Reply

Marsh Posté le 30-10-2003 à 12:20:40    

LetoII a écrit :


 
Ben ouai, c ce qui était dit sur la page que je t'ai fillé il me semble.
 
EDIT: Y aaurait pas plus simple, avec une interface COM par exemple?

Ca ne ma'a pas semblè évident non. Surtout qu'après expérimentation, le hwnd que je passe, je ne sais pas à quoi il sert, puisque la fenetre que je crée n'ai pas utilisée et qu'il en recrée une autre.
Pour l'interface COM, je sais pas, c'est mon premier prog pour windows alors bon...


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed