2 questions...

Utilisateur anonyme - 14 août 2007 à 13:14
 Utilisateur anonyme - 14 août 2007 à 18:23
Hello,

Voilà , j'arrive à lancer ma dll de la manière suivante :

#include <windows.h>

void __stdcall CALLBACK M2(char *s) {}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HANDLE hD1;
typedef int (__stdcall* lp3) ();
lp3 D1;
hD1 = LoadLibrary("Test.dll");
D1 = (lp3) GetProcAddress((HINSTANCE)hD1, "_DLL@4");
D1(&M2);
return 0;
}

en fait ça fonctionne bien de cette façon mais comme c'est moi qui l'ai fait ça ne me semble pas très orthodoxe surtout le void __stdcall CALLBACK M2(char *s) {}. Ya t'il une autre voie pour faire de D1(&M2); quelque chose qui ressemblerait à ceci : D1(void __stdcall CALLBACK M2(char *s) {}); ?

Deuxième question : savez-vous à quoi correspond le @4 dans D1 = (lp3) GetProcAddress((HINSTANCE)hD1, "_DLL@4"); ? Je sais que _DLL appelle la fonction dans la dll mais je ne sais pas à quoi sert ce @4...

Merci.

5 réponses

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
14 août 2007 à 14:57
Déjà, CALLBACK est un __stdcall. Inutile d'ajouter un __stdcall avant.
Ensuite void __stdcall M2(char *s) {}  C'est sensé être quoi ? Pour l'instant, ça a l'aire d'une fonction qui ne faire rien.

Pour ta deuxième question, le 4 correspond au poids en bit des arguments de la fonction.

C++ (@++)<!--
0
Utilisateur anonyme
14 août 2007 à 15:56
Salut SAKingdom,

Alors si je retire soit CALLBACK soit __stdcall, le résultat de l'opération est "l'instruction à 0x00000000...l'adresse ne peut pas être read" lorsque je lance le prog. Comme il n'y a pas d'erreur à la compil peut-être est-ce parce que je déclare mal la fonction d'appel dans la dll...à vrai dire j'en sais rien
Tiens voilà sur quoi je m'entraine si ça peut t'aiguiller :

test.dll
#include <windows.h>
#include "Test.h"

DLL_API int __stdcall DLL(DWORD LP1) {
  STARTUPINFO zi;
  PROCESS_INFORMATION wi;
  memset(&zi, 0, sizeof(zi));
  zi.cb = sizeof(zi);
  CreateProcess(0, "test1.exe", 0, 0, 0, 0, 0, 0, &zi, &wi);
   return 0;
}

test.h
#define DLL_API __declspec(dllexport)

DLL_API int __stdcall DLL(DWORD lp1);

En ce qui concerne void __stdcall M2(char *s) {}, ben si je le retire ainsi que D1(&M2); (obligé), la dll ne se lance plus...

Pour le poid, les 4 bytes sont où précisément ? Dans DWORD lp1 ?

Merci.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
14 août 2007 à 16:04
On dirait que c'est bon là. Cependant, je ne vois pas à quoi sert LP1 et pourquoi dans le code appelant, tu passent en param une fonction quand tu demande un DWORD.

"correspond au poids en bit des arguments"
Houla la fatigue. En effet, ces le poids en octet en non en bit.
Oui, il s'agit du DWORD qui fais 4 octets.

C++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
14 août 2007 à 16:08
En passent, ta DLL n'a pas une .lib généré avec ? Elle devrait être présente. Si c'est le cas, copie la dans le rep de ton projet, ajoute la au linker et déclare les prototypes de ta fonction dans ton .c (si tu n'a pas fais de .h). Ça devrait donner quelque chose comme ça:
__declspec(dllimport) int __stdcall DLL(DWORD lpt1);

Tu devrais pouvoir l'appeler simplement avec son nom plutôt que d'utiliser LoadLibrary et GetProcAddress

C++ (@++)<!--
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
14 août 2007 à 18:23
Merci SAKingdom, j'ai réussi à faire ce que je voulais CAD  :  DLL_API int __stdcall DLL() et lancer la dll avec _DLL@0 (moi-auusi je ne voyais pas à quoi pouvait servir ce DWORD lpt1) là c'est plus propre à mon goût ;) avec la lib d'ajouté.

Encore merci.

Bonne soirée.

Victor
0
Rejoignez-nous