Précédent   Forum des professionnels en informatique > Systèmes > Windows > Windows XP
Windows XP Forum d'entraide Windows XP. Avant de poster : La F.A.Q Windows XP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/03/2011, 17h05   #1
Membre du Club
 
Inscription : avril 2007
Messages : 168
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 168
Points : 44
Points : 44
Par défaut API32 et appel DLL

Bonjour,
Je voudrais, depuis mon programme principal lancer une fonction qui se trouve dans une dll en lui passant un paramètre.
Tout d’abord quand je ne passe pas de paramètre, je fais ceci et ça marche très bien :
Code :
1
2
3
4
1.- FARPROC dllEntryAdd1;
2.- hinstdll = LoadLibrary(lpchemindll);
3.- dllEntryAdd1 = GetProcAddress(hinstdll, dllEntrySet);
4.- dllEntryAdd1(); // ici ma dll chargée dans mon prog principal démarre correctement
Lorsque je veux passer un paramètre j’obtiens des erreurs de compil sur le prog ppal (donc sans rapport avec la présentation côté dll puisque je ne vais pas jusqu’au link) !
Lorsque je modifie uniquement la ligne 4 comme ci-dessous :
Code :
1
2
3
4
1.- FARPROC dllEntryAdd1;
2.- hinstdll = LoadLibrary(lpchemindll);
3.- dllEntryAdd1 = GetProcAddress(hinstdll, dllEntrySet);
4.- dllEntryAdd1(lpbuffer);
J’obtiens l’erreur de compile suivante : « Extra parameter » sur la ligne 4
Lorsque je modifie la ligne 1 et 4 comme ci-dessous :
Code :
1
2
3
4
1.- FARPROC dllEntryAdd1(LPTSTR); //ou encore : FARPROC dllEntryAdd1(char *p);
2.- hinstdll = LoadLibrary(lpchemindll);
3.- dllEntryAdd1 = GetProcAddress(hinstdll, dllEntrySet);
4.- dllEntryAdd1(lpbuffer);
J’obtiens l’erreur de compile suivante : « Lvalue required » sur la ligne 3
Lorsque je modifie les lignes 1, 3 et 4 comme ci-dessous :
Code :
1
2
3
4
1.- FARPROC dllEntryAdd1(LPTSTR); //ou encore : FARPROC dllEntryAdd1(char *p);
2.- hinstdll = LoadLibrary(lpchemindll);
3.- dllEntryAdd1(lpbuffer) = GetProcAddress(hinstdll, dllEntrySet);
4.- dllEntryAdd1(lpbuffer);
J’obtiens encore l’erreur de compile suivante : « Lvalue required » sur la ligne 3
Je sais bien que ce dernier exemple est farfelu, ou peut-être que j’aurais dû mettre cette question dans le forum programmation c++ ?
Help per favor
Thanks
Athur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2011, 17h42   #2
Expert Confirmé Sénior
 
Avatar de ram-0000
 
Raymond
Inscription : mai 2007
Messages : 7 471
Détails du profil
Informations personnelles :
Nom : Raymond

Informations forums :
Inscription : mai 2007
Messages : 7 471
Points : 10 993
Points : 10 993
Tu as un problème de déclaration de pointeur de fonction et de cast.

Lorsque tu déclares ton ptr de fonction comme ceci :
cela signifie que ta fonction est du type Lorsque tu déclares ton ptr de fonction comme ceci :
Code :
FARPROC dllEntryAdd1(LPTSTR);
cela signifie que ta fonction est du type Lorsque tu récupères l'adresse de ta fonction avec GetProcAddress(), tu récupère un ptr de fonction du type FARPROC et donc Si tu veux mettre ce pointeur dans une variable d'un autre type, il faut obligatoirement caster.

En fait, quand je dois travailler avec des pointeurs de fonction, systématiquement, je créé un type pour cette fonction. Par exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
// déclaration d'un ptr de fct qui retourne void et qui attent un paramètre int et char *
typedef void (*MonPtrFct_t)(int, char *);

// définition du pointeur de fonction
MonPtrFct_t dllEntryAdd1;

// chargement de la DLL
hinstdll = LoadLibrary(lpchemindll);

// récupération du pointeur
dllEntryAdd1 = (MonPtrFct_t)GetProcAddress(hinstdll, dllEntrySet);
Pour info, dans windef.h
Code :
1
2
#define WINAPI  __stdcall
typedef int (FAR WINAPI *FARPROC)();

PS : cette discussion aurait eu une meilleure visibilité dans un forum de programmation (Windows ou C)
__________________
Raymond

Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
WinAgentLog WinAgentLog est un service Windows qui collecte en temps réel les messages Microsoft EventLog et les retransmet en utilisant le protocole Syslog à une machine distante.
e-verbe Un logiciel de conjugaison des verbes de la langue française

Ma page personnelle sur DVP

ram-0000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2011, 20h40   #3
Membre du Club
 
Inscription : avril 2007
Messages : 168
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 168
Points : 44
Points : 44
Par défaut API32 et appel DLL

Merci,
Je n'ai pas répondu tout de suite car depuis tout à l'heure je cherche à comprendre l'explication, il faut que je retrouve une doc. Je n'avais pas conscience que je voulais mettre un pointeur dans une variable d'un autre type. Ce qui m'intéressait c'était au moment où dans mon programme principal je lance l'exécution de ma fonction en dll de lui passer en paramètre l'adresse d'un buffer (lpbuffer) qui se trouve dans le programme principal afin que ma fonction dll puisse aller lire ce buffer. Dans l'exemple, je ne vois pas à quel endroit je lance l'exécution de la dll, ni comment je lui passe l'adresse de ce buffer. Mais c'est probablement qu'il faut que je retourne vers des cours. Je vais réessayer de comprendre.
Cordialement,
Athur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 08h05   #4
Membre du Club
 
Inscription : avril 2007
Messages : 168
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 168
Points : 44
Points : 44
Par défaut API32 et retour DLL

Je crois que j'ai à peu près compris maintenant, j’ai fait ça:

Code :
1
2
3
4
typedef INT (WINAPI* PMAFONCTION)(char* );
PMAFONCTION dllEntryAdd1;
dllEntryAdd1 = (PMAFONCTION)GetProcAddress(hinstdll, dllEntrySet);
iret=dllEntryAdd1(lpcheminlog);
et ça marche impeccable merci, sauf que maintenant j’ai un problème dans ma DLL,
mais peut-être vas-tu me dire que c’est normal :

Dans mon point d’entrée ci-dessus (dllEntryAdd1) de ma dll, je me contente de récupérer l’adresse lpcheminlog qui est l’adresse dans mon programme principal du chemin d’un fichier dans lequel ma dll écrira un peu plus tard et je fais passer cette adresse en variable globale de ma dll (Nomfichier = lpcheminlog) (Nomfichier est une variable globale). Je me contente ensuite toujours dans le même point d’entrée de ma dll de lancer un hook pour récupérer les touches du clavier et je reviens immédiatement dans mon programme principal qui lui contient la boucle Getmessage.
Il faut préciser que la callback de traitement des touches se trouve dans ma dll et c’est elle qui ira écrire dans le fichier dont le chemin est dans le programme principal et l’adresse de ce chemin en variable globale de ma dll.
Je tape une ou deux touches tout se passe bien, puis tout à coup la variable globale de ma dll (Nomfichier) perd l’adresse du buffer du programme principal qui contient le nom du fichier. Est-ce normal ? J’ai essayé de mettre Nomfichier en variable static mais ça ne change rien !
Faut-il que je recopie le chemin du fichier (et pas seulement son adresse) dans une variable globale de ma dll ?
Merci
Athur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h29.


 
 
 
 
Partenaires

Hébergement Web