Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
5257 connectés 

  FORUM HardWare.fr
  Programmation

  [ dll ]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ dll ]

n°55949
pymousses
Posté le 29-08-2001 à 00:56:35  profilanswer
 

Sous visual c++ 6.0, je créé une dll mais lorsque j'essaye d'appelé une fonction contenue cette dll le programme ne fonctionne pas. Qd j'affiche la valeur du pointeur de la fonction celle ci est 0. Pourtant la dll est bien trouvé puisque lorsque j'affiche la valeur l'handle de la dll ki est recuperé elle n'est pas null.
 
QQ'1 sait t'il d'ou pourrait venir le problème?
 
Comment fonctionne le fichier .def?
Le problème pourrait t'il venir de ce fichier?
 
Merci.

mood
Publicité
Posté le 29-08-2001 à 00:56:35  profilanswer
 

n°56006
SoWhatIn22
Posté le 29-08-2001 à 11:28:14  profilanswer
 

hello,
 
pour commencer, regarde dans la table d'exportation du .lib généré en même temps que ta dll. Tu devrais y voir la fonction que tu cherches à appeler. Si tu ne la vois pas, alors ca peut vouloir dire que tu n'exportes par la fonctions comme tu crois le faire dans ton projet de dll.
 
pour info, si tu as Visual Studio, ms te fournit un programme qui s'appelle Depends.exe. Tu peux aussi ouvrir ta dll avec ca. Ca va te montrer les fonctions exportées ainsi que les dépendances envers les autres dll.
 
Eventuellement, tu peux dire comment tu fais pour (essayer) de récupperer l'@ de la fonction en question?

n°56010
BENB
100% Lux.
Posté le 29-08-2001 à 11:40:41  profilanswer
 

Utilises-tu un fichier .DEF ?
Ton probleme resemble a un proble de decoration de fonction.
essaye de mettre extern 'C' avant ta fonction pour supprimmer les  decorations...

n°56013
JPA
Posté le 29-08-2001 à 11:47:30  profilanswer
 

Si tu n'as pas VS, va sur www.bellamyjc.net , il a écrit un prog appelé SCANBIN qui va te lister (entre autres) les fonctions exportées des DLL.
A+

n°56042
pymousses
Posté le 29-08-2001 à 12:44:12  profilanswer
 

BENB a écrit a écrit :

Utilises-tu un fichier .DEF ?
Ton probleme resemble a un proble de decoration de fonction.
essaye de mettre extern 'C' avant ta fonction pour supprimmer les  decorations...  




 
Je n'utilise pas de fichier .def. Ou j'ai essayé mais il y a peu de chance qu'il soit pris en compte car je ne sait pas comment on fait pour qu'il soit prit en compte lors de la compiliation.
QQ'1 peut t'il m'expliquer?

n°56044
pymousses
Posté le 29-08-2001 à 12:52:52  profilanswer
 

hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "coco" );  
 
printf("%d\n",hkprcSysMsg);   // ici ca affiche 0.
 
Il n'a donc pas trouvé la fonction. En utilisant depends rien n'apparait en haut à droite. REM : j'utilise msdev.

n°56046
pymousses
Posté le 29-08-2001 à 13:01:26  profilanswer
 

BENB a écrit a écrit :

Utilises-tu un fichier .DEF ?
Ton probleme resemble a un proble de decoration de fonction.
essaye de mettre extern 'C' avant ta fonction pour supprimmer les  decorations...  




 
Pour une fonction de ma dll qui s'appelle : fnWaget3, en observant avec dependency walker de msdev la fonction est :  
?fnwaget3@@YAHXZ. A l'origine ce n'est pas ce nom que j'ai donné à ma fonction.
 
Don si je met qqc du genre :  
extern 'C' int fnWaget3(void) {
...
...
}
 
dans le programme de ma dll, la solution pourrait être résolue?

n°56059
BENB
100% Lux.
Posté le 29-08-2001 à 13:25:06  profilanswer
 

Oui, je ne sais plus si c'est extern "C" ou extern 'C'...
Evidement tu ne dois plus utiliser les surcharges pour ce nom de fonction, et il est possible qu'il faille ajouter un _ dans le GetProcAdress...
Sinon tu as bien exporte ta fonction (je sais c'est elementaire)
 
Pour le .DEF c'est une forme un peu desuette, mais il me semble me rappeller qu'elle permet d'exporter une fonction decoree avec un nom non decore.... Dans ms dev tu l'ajoutes a ton projet.
Malheureusement je ne sais plus de la syntaxe de ce genre de fichiers :(
 
les decoration ce sont les @@YAHXZ que tu vois autour du nom de ta fonction, et qui permettent d'indiquer les types des parametres... Malheureusement d'un compilo a l'autre elle ne sont pas les meme :(

n°56080
SoWhatIn22
Posté le 29-08-2001 à 14:35:35  profilanswer
 

BENB a écrit a écrit :

Oui, je ne sais plus si c'est extern "C" ou extern 'C'...




c'est: extern "C"
 
bon, le pb c'est que visiblement tu essayes d'exporter des fonctions C++. C'est possible, mais comme le dis BENB, il y a alors une décoration du nom de la fonction, parce que en C++, on peut surcharger les fonctions.
Si ta dll contient les fonctions:
 
int coco(int a, int b);
int coco(int a, int b, int c);
 
, alors comment veux tu savoir quelle fonction prendre quand tu appelles la fonction 'coco' avec GetProcAddress.
Donc 2 solutions:
 
soit tu link ton programme avec le .lib généré en même temps que ta dll (ce qui veut dire que ton programme ne pourra pas s'éxécuter si ta dll n'est pas présente, ou alors il faut mettre l'option /DELAYLOAD dans tes options de link (cf MSDN à ce sujet)), soit comme le dit BENB tu fait une interface en C à tes fonctions, et tu exportes les fonctions C. En effet, il n'y a pas de décoration de nom pour les fonctions déclarées comme étant des fonctions "C".

n°56430
aqwsezsxdr
Posté le 30-08-2001 à 23:39:11  profilanswer
 

pymousses> faut surtout pas linker ton truc en statique vu ce que tu veux faire (HOOK)
 
tu ecris un .def qui a cette gueuele
 
LIBRARY   HOOKDLL
EXPORTS
   KeyboardProc   @1
 
tu l'inclus ds le proj dans les source files et tu demande a ce qu'il soit pas compilé (exclude from build)
 
ensuite dans ta dll, tu cree un fct comme suit
 
extern "C"  LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,       LPARAM lParam)
{
.........
}
 
et voila ca devrait aller un peu mieux.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [ dll ]

 

Sujets relatifs
Plus de sujets relatifs à : [ dll ]


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)