[ dll ] - Programmation
Marsh Posté le 29-08-2001 à 11:28:14
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?
Marsh Posté le 29-08-2001 à 11:40:41
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...
Marsh Posté le 29-08-2001 à 11:47:30
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+
Marsh Posté le 29-08-2001 à 12:44:12
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?
Marsh Posté le 29-08-2001 à 12:52:52
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.
Marsh Posté le 29-08-2001 à 13:01:26
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?
Marsh Posté le 29-08-2001 à 13:25:06
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
Marsh Posté le 29-08-2001 à 14:35:35
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".
Marsh Posté le 30-08-2001 à 23:39:11
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.
Marsh Posté le 29-08-2001 à 00:56:35
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.