Dll étrangère

Résolu
georgeduke
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007
- 8 août 2005 à 11:03
vecchio56
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
- 8 août 2005 à 16:30
Bonjour,



Je n'arrive pas à utiliser les fonctions d'une dll "étrangère" ; cette
dll s'appelle rw_data.dll, je n'ai que ce fichier : donc pas de *.lib
ou de *.def



Le LoadLibrary fonctionne, mais je n'arrive pas à accéder à la fonction qui m'intéresse...ImpFuncDLL est toujours null :-(




typedef DWORD (__stdcall *MYDLLFUNC) (char* FileName);




void monter_dta()

{

HINSTANCE hinstDLL;

MYDLLFUNC ImpFuncDLL;

DWORD Result;

if ((hinstDLL=LoadLibrary("rw_data.dll")))

{

ImpFuncDLL = (MYDLLFUNC)GetProcAddress(hinstDLL, "dtaCreate");

if (ImpFuncDLL != NULL)

{

printf("Appel de la fonction dtaCreate\n");

ImpFuncDLL("A9.dta");

}

//liberation de la dll

FreeLibrary(hinstDLL);

}

}

J'utilise DevC++ et je ne
voulais savoir si c'était mon code qui clochait ou le fait que je ne
dispose pas d'un fichier *.def ou autre...



Merci beaucoup pour votre aide

13 réponses

BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
8 août 2005 à 12:58
D'après la description, l'export ne me parait ni "C" ni __stdcall mais C++ standard, surement pour cela que le compilo ne trouve pas la fonction car son nom est "décoré". Teste en compilant C++ et fais un header h sans extern "C".

ciao...
BruNews, MVP VC++
3
simtiers
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

8 août 2005 à 13:34
Sinon, essaie de retrouver le logiciel Depends (gratos) :

http://www.dependencywalker.com/



Ce logiciel list toutes les fonctions exportées par une DLL (sans les paramètres par contre)

Mais c'est bien le nom "décoré" qui est indiqué...
3
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
8 août 2005 à 11:06
tu as bien exporté en extern "C" et __stdcall ?

ciao...
BruNews, MVP VC++
0
georgeduke
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

8 août 2005 à 11:19
Cette dll n'est pas de moi malheureusement donc je ne sais pas si ça a été fait..


C'est une dll d'un jeu, j'ai trouvé toutes les infos sur ces fonctions
grâce à cette page : http://www.kamalook.de/Mafia/DTA.html

Une idée ??
0

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

Posez votre question
DeAtHCrAsH
Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013

8 août 2005 à 11:42
As tu pensé à verifier la syntaxe de la fonction ???
Il y a souvent ce problème avec les appelles de fonction a partir de DLL, les param sont mauvais.

Shell
0
georgeduke
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

8 août 2005 à 12:45
Oui j'ai vérifié la syntaxe de la fonction : DWORD dtaCreate(char*
FileName);



Elle correspond bien à ma description faite dans mon code... Je ne comprends pas...
0
georgeduke
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

8 août 2005 à 13:37
Merci beaucoup, vos réponses me redonnent un peu d'espoir.. y a plus qu'à essayer ;-)
0
DeAtHCrAsH
Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013

8 août 2005 à 14:08
J'ai pu voir sur le site du gars, qu'il y a son mail d'indiqué au cas de problème de l'utilisation de la DLL.
Tu peux toujours essayé de lui en envoyé un.

Shell
0
georgeduke
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

8 août 2005 à 14:10
Oui ça fonctionne !! Merciiiiiii !! Le logiciel que tu m'as indiqué est
impressionnant !! Le nom de la fonction est bien décoré ; en fait elle
s'appelle _dtaCreate@4 ! Maintenant je vais pouvoir essayer de
l'utiliser :-)
0
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
8 août 2005 à 14:25
Attention depends.exe peut donner les 2 vues sur les exports, décoré ou non.
[mailto:_dtaCreate@4 _dtaCreate@4] s'il est lu ainsi en vue déco alors c'est que la fonction est bien exportée en extern "C" car ici il n'y a aucune déco du nom, c'est le pur standard __stdcall, un compilo C doit pouvoir trouver le point d'entrée sans problème et GetProcAddress() idem avec "dtaCreate". Le 4 final indique seulement le nombre d'octets empilé en paramètre, donc ici 1 seul param car chaque param empile 4 octets sur system 32 bits.

ciao...
BruNews, MVP VC++
0
georgeduke
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

8 août 2005 à 15:13
Oui depends.exe donne les deux vues, mais meme si je passe de la vue
décorée à la vue non décorée le nom de la fonction reste _dtaCreate@4.
Le problème est lié au fait que je compile en c++ ? Est-ce pour ça que
le compilo ne trouve pas "dtaCreate" tout court ?
0
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
8 août 2005 à 15:20
certainement mais comme indiqué plus haut, tu peux rester en compilation C++ si tu mets extern "C" devant les dééclaratins de fonctions dans le fichier h.
Ton fichier h à remplir sur ce modèle:

#ifndef MALIB_H
#define MALIB_H


#ifdef __cplusplus
extern "C" {
#endif


int __stdcall mafunc1(unsigned char *dest);


int __stdcall mafunc2(unsigned int *srcLen, const unsigned char *source);


#ifdef __cplusplus
}
#endif


#endif /* MALIB_H */

Bien sur tu vires les __stdcall si ce n'est pas le cas.

ciao...
BruNews, MVP VC++
0
vecchio56
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
8 août 2005 à 16:30
depends.exe
> A tu regardé l'excellent code de aardman la dessus? C'est celui la que j'utilise tout le temps
http://www.cppfrance.com/code.aspx?ID=25603
0