logo

Knowledge Is Power

 
 

- Reinit des nouveaux posts -

- Recherche -

Messages Privés - Derniers posts
S'enregistrer - Login - Liste des membres
Vous logger : Login Pass

Programmation - Langages de Programmation >> Appel à une DLL Newtopic | Reply
poster txt
bib0
Inscrit le 25-02-2005
Avatar
Posté le 08-12-2011 11:36

Salut à tous,

J'essaie de me lancer ds la prog. Windows et en particulier, l'appel à une .dll (j'ai placé la barre assez haut ).
J'utilise Dev-C++. Qd je compile mon bout de code (vraiment le truc de base):

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
BOOL res;
LPTSTR fonctAdr;
HINSTANCE hDll;

//get dll func address
hDll = LoadLibrary("toto.dll");
if(hDll != NULL)
{
printf("DLL chargee.\n");
fonctAdr = (LPTSTR)GetProcAddress(hDll,"HelloWorld");
if (fonctAdr != NULL) {
printf("La fonction a ete trouvee: ");
printf("0x%x\n",fonctAdr);
(fonctAdr)("toto");
}
}
system("PAUSE");
res = FreeLibrary(hDll);
return 0;
}

J'ai le message d'erreur suivant:
21 C:\Dev-Cpp\Examples\Dll\Hello.cpp `fonctAdr' cannot be used as a function

Si qq'un avait une idée du pourquoi

Voici le code de ma DLL, toto.dll
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

DLLIMPORT void HelloWorld (char *ch )
{
/*MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);*/
printf("Hello %s from dll \n",ch);
}


BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;

case DLL_PROCESS_DETACH:
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
PS: ma dll se compile bien.

[ Ce Message a été édité par: bib0 le 2011-12-08 11:40 ]
profil | edit | quote
sirius_black
Inscrit le 05-07-2003
Avatar
Posté le 08-12-2011 14:15

C'est ta déclaration qui pose problème :
LPTSTR fonctAdr;

Tu devrais déclarer fonctAdr comme un pointeur sur fonction style (void*)(fonctAdr(char*)) mais suis pas sûr de la syntaxe... à toi de fouiller
_________________________
d4 n3wS
profil | mail | Website | edit | quote
bib0
Inscrit le 25-02-2005
Avatar
Posté le 08-12-2011 16:55

Salut Sirius,

Bien vu J'ai rajouté:
typedef UINT (CALLBACK* LPTSTR)(char *);

comme indiqué ds:
http://msdn.microsoft.com/fr-fr/library/64tkc9y5(v=vs.80).aspx dit:

Comme vous appelez la fonction de la DLL par l'intermédiaire d'un pointeur et qu'il n'y a pas de vérification de type au moment de la compilation, assurez-vous que les paramètres de la fonction sont corrects de façon à éviter de dépasser la mémoire allouée sur la pile et de provoquer une violation d'accès. L'une des façons d'assurer la sécurité des types est d'examiner les prototypes des fonctions exportées et de créer des typedefs correspondants pour les pointeurs de fonction.

Et ça fonctionne.

@++

Bib0

[ Ce Message a été édité par: bib0 le 2011-12-08 17:20 ]
profil | edit | quote
Newtopic | Reply

Online : Curtiskt, ejuxocoyucis, icucfiufahuv, iwocajucuget, iyunefet, onaenaacaxisi, orauyumelaxuh, Richardcauth, Robertwak et 96 Guests


Retour Index NewFFR Repository : http://taz.newffr.com
Cagades à Stick : http://alcane.newffr.com
Forum HTML et Archive -> ici
ForumFR Sql/Xml (2006/04) (SF pas à jour du tout...) - Alive since 2001 Newffr.com
Pour toute plainte ou problème -> Contacter Borax, Hyatus, Tweakie ou Stick par message privé (ou Gueulez sur le forum :) )
Retour haut de page