utiliser une DLL fournie dans un projet Visual C++ - C - Programmation
Marsh Posté le 31-07-2007 à 09:03:12
Pour avoir plus d'infos sur l'étape de linkage:
tu as regardé "Linker > General > Show Progress" ?
Marsh Posté le 31-07-2007 à 09:07:44
Je ne connaissais pas, mais je viens d'essayer en le passant en verbeux :
|
Et c'est tout. Aucun message relatif au .lib, donc (pourtant, si je le vire, ca ne linke plus, normal).
Marsh Posté le 31-07-2007 à 09:11:07
Ah, tiens, en regenerant j'ai plus d'infos, je ne connaissais pas la génération incrémentielle :
Édition des liens en cours... |
Mais dans tout ce paté, aucune référence a ma fonction Hn_Init
Marsh Posté le 31-07-2007 à 09:13:01
c'est génant il me semble xD
tu peux montrer à quoi ressemble ton api_lec.h ?
quand tu passes ta dll dans depends.exe tu vois bien Hn_Init exporté ?
Marsh Posté le 31-07-2007 à 09:21:14
BenO a écrit : c'est génant il me semble xD |
Il est assez moche.
Code :
|
BenO a écrit : quand tu passes ta dll dans depends.exe tu vois bien Hn_Init exporté ? |
Oui, il est bien exporté, je viens de vérifier.
Par contre, quand j'ouvre la dll, j'ai ce message :
"Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module"
mais ca n'a pas l'air genant.
Marsh Posté le 31-07-2007 à 09:27:46
(ah, la dll elle même fonctionne, je viens de faire un appel par DllCall en autoit, ca me renvoie bien le code erreur que j'attends)
Marsh Posté le 31-07-2007 à 10:09:25
ReplyMarsh Posté le 31-07-2007 à 10:41:41
Bon, j'ai testé la compile en ligne de commande :
|
même résultat.
Marsh Posté le 31-07-2007 à 10:56:58
Y a souvent un #define à mettre quand tu utilises un DLL. En general, il sert à differencer le moment ou tu compiles to DLL de celui ou tu l'utilises. Soit il y est pas et il faut le mettre, soit il y est et il faut l'enlever
Marsh Posté le 31-07-2007 à 11:28:48
lorill a écrit : elle y est déjà (lignes 38 et 49 du snippet du dessus) |
Pardon, j'avais pas capté.
Heu, c'est illisible, ce qui fait que je ne peux pas vérifier ce dont JoelF parle: la bonne présence d'un declspec(dllexport) quand tu compiles la dll, et la présence d'un declspec(dllimport) quand tu inclues le .h depuis ton appelant. Tu peux vérifier ça (en appellant le préprocesseur, ou bien en déroulant les macros à la main)
Marsh Posté le 31-07-2007 à 12:29:12
bon, pour faire simple, j'ai viré l'include, et ajouté le prototype de la fonction Hn_Init en début de fichier :
Code :
|
mais du coup, j'ai une erreur au link :
test.obj : error LNK2001: symbole externe non résolu __imp__Hn_Init |
d'ou vient le __imp__ ?
Marsh Posté le 31-07-2007 à 12:42:59
l'idée c'est d'avoir un truc comme ça dans ton .h
Code :
|
Ensuite de définir (ou pas) MY_DLL_EXPORTS dans les settings de ton projet (tu as l'air d'être sous visual6).
Marsh Posté le 31-07-2007 à 12:54:54
_darkalt3_ a écrit : l'idée c'est d'avoir un truc comme ça dans ton .h
Ensuite de définir (ou pas) MY_DLL_EXPORTS dans les settings de ton projet (tu as l'air d'être sous visual6). |
le truc c'est que je ne peux pas recompiler la dll, ni savoir comment elle a été compilée. Mais vu que les symboles sont trouvés par depends, ca doit être bon, non ? (non, e suis sous visual express 2003)
donc j'ai mis ce paté :
Code :
|
mais il me ressort l'erreur du symbole __imp__XXX introuvable
Marsh Posté le 31-07-2007 à 13:17:02
lorill a écrit : mais il me ressort l'erreur du symbole __imp__XXX introuvable |
Elle a probablement été mal compilée alors : le .lib ne contient pas de __imp__XXX, alors même que tu en veux un vu que tu importes un truc d'une dll.
Et pour qu'il contienne le __imp__XXX, il faudrait que la dll soit compilée avec le __declspec(dllexport).
Bon, tu dois pouvoir te débrouiller avec un .def, ou bien en utilisant le couple LoadLibrary/GetProcAddress dans ton code appellant.
Marsh Posté le 31-07-2007 à 13:32:02
le LoadLibrary marche, c'est ma solution de secours.
Tu peux m'en dire plus sur le .def ?
Marsh Posté le 31-07-2007 à 13:39:02
Chaipas exactement comment faire simple. Essaye donc ça:
http://support.microsoft.com/kb/131313
Marsh Posté le 31-07-2007 à 13:57:11
ok, merci. J'ai du louper quelque chose quand même :
1. J'exporte la liste des symboles avec dumbin, j'en fait un fichier .def
2. Je transforme le .def en .lib avec lib /def:XXX
3. Je link contre la lib générée
=> aucune dépendence a la dll dans l'exe généré, et il plante toujours de la même manière
Le pire, c'est que je suis sur qu'il manque pas grand chose.
Marsh Posté le 31-07-2007 à 21:31:23
lorill a écrit : ok, merci. J'ai du louper quelque chose quand même : |
si t'utilises loadlibrary / GetProcAdress, je crois pas que t'aies besoin de .def, juste des prototypes que tu recherches et de la dll.
Marsh Posté le 01-08-2007 à 08:36:07
_darkalt3_ a écrit : |
Le but, c'était justement de pas se faire chier avec les GetProcAddress, mais je n'ai pas le choix finalement.
Par contre, j'ai cette erreur :
|
en googlant, j'ai vu que si je passait en release, y'aurait plus ce message, mais ca me semble de la bricole. Une idée ?
Marsh Posté le 01-08-2007 à 08:52:36
bon, j'ai trouvé, manquait un _stdcall devant le pointeur de fonction.
y'a plus qu'a.
merci a tous
Marsh Posté le 26-06-2008 à 17:28:39
Salut!
Je pense que j'ai le même problème que toi... Peux tu me dire comment tu as fais , ou as tu mis le _stdcall??
Marsh Posté le 27-06-2008 à 08:02:10
Code :
|
Code :
|
Marsh Posté le 27-04-2011 à 14:16:16
Bonjour
Vous pouvez communiquer le code complet de l'appelle de cette DLL ?
Comme vous l'aviez fais au tout début du sujet
Merci
Marsh Posté le 31-07-2007 à 08:47:53
Voila ce qui arrive quand on demande a un unixien javateux de faire du C sous windows
Bon, j'ai une dll, le .lib qui est censé aller avec, et des fichiers entetes. Je tente un appel quelconque de méthode, pour voir si je suis sur les bons rails :
Pour que ca compile, j'ai précisé ces parametres dans mon projet :
* dans "Editeur de liens/General", j'ai "Répertoires de bibliothèques supplémentaires" vers "D:\mon projet\lib" (qui contient le .lib associé a la dll)
* dans "Editeur de liens/Entrées", j'ai "Dépendences supplémentaires" qui contient "api_lec.lib".
Je compile, ca roule, pas de warning, ca link, et ca me génère un beau test.exe.
Je l'execute, ca plante.
Je le débugue, il me dit que Hn_Init à l'adresse 0x0000000, autant dire que c'est pas fameux.
En début de débuggage, visual a la bonté de me dire quelles sont les dll chargées, et évidemment, la mienne n'y est pas.
Si j'execute "dependency walker" sur mon exe, la dépendence vers ma dll n'est effectivement pas marquée.
Mais alors, comment lui dire de dépendre de cette dll, si ajouter le .lib en dépendence ne suffit pas ?
Merci !