Accueil > Forum > > > > importer une fonction depuis un dll externe
importer une fonction depuis un dll externe
lundi 6 août 2007 à 16:58:54 |
importer une fonction depuis un dll externe

Rabbi Jakob
|
Bonjour, Je programme en c++ sous visual studio 2005 J'ai un petit problème avec ma dll  Je dispose d'une dll avec son fichier .lib. Je les ai mis tous les 2 dans le répertoire où se trouve le .exe de mon projet, et j'ai linké la librairie aux projet dans project dépendencies. Mon problème est le suivant. J'appelle une fonction MaFonction dans ma dll MaDLL.dll. MaFonction prend en argument une structure MaStructure. MaStructure et MaFonction sont définies dans le fichier header généré avec la dll, MaDll.h. Si je fais extern "C" __declspec(dllimport) void MaFonction(MaStruct), et que je le place après #include <MaDll.h>, il me lance une erreur C2732, selon laquelle ma fonction est déjà définie ailleurs (ce que je conçois aisément puisqu'elle est dans le .h) Seulement, si je ne place pas le extern "C" declspec(dllimport)... , et que je mets seulement le fichier .h, il me lance une erreur LNK2001, il ne trouve pas la fonction (unresolved external symbol)  Pourtant la librairie est bien linkée. Je ne comprends vraiment pas, j'ai lu la msdn, j'ai fouillé un max de forum, j'ai essayé une autre fonction de la dll qui prend des types simples, et là c'est encore plus étrange  Si je fais le extern "C" _declspec double FonctionSimple (double, double), et que je place ça avant la déclaration des fichiers .h, la fonction sort le bon résultat. Si je le mets après le .h, il me ressort l'erreur C2732 (déjà définie), et je ne mets pas le extern "C"..., il me remet aussi l'erreur LNK2001. Le problème, c'est que j'ai bosoin de la struct MaStruct, et donc je peux pas mettre extern "C" __declspec(dllimport) void MaFonction(MaStructure) avant la déclaration des fichiers .h, sinon il ne reconnapit pas MaStructure....  Bref, je suis perdu, si quelqu'un a déjà eu un problème comme ça, pensez à un pauvre débutant en informatique  Rabbi Jakob
|
|
lundi 6 août 2007 à 17:21:49 |
Re : importer une fonction depuis un dll externe

SAKingdom
|
Les prototypes de tes fonctions sont déjà dans le .h ? Si oui, à quoi ça sert de redéclarer le prototype. La fonction devrait être utilisable dès que tu inclus ton .h. C++ (@++)
|
|
lundi 6 août 2007 à 17:23:23 |
Re : importer une fonction depuis un dll externe

SAKingdom
|
Ah oups "Seulement, si je ne place pas le extern "C" declspec(dllimport)...
, et que je mets seulement le fichier .h, il me lance une erreur
LNK2001, il ne trouve pas la fonction (unresolved external symbol)" J'avais mal interprété ça. Désolé. C++ (@++)
|
|
lundi 6 août 2007 à 17:28:15 |
Re : importer une fonction depuis un dll externe

SAKingdom
|
Bon alors. Dans ton .h, as tu ajouté ceci en début de fichier #ifdef __cplusplus extern "C" { #endif et ceci en fin #ifdef __cplusplus } #endif En gros, ça devrait donner ça //.h #ifndef _MADLL_INCL #define _MADLL_INCL #ifdef __cplusplus
extern "C" {
#endif int __stdcall MaFonction1 (void); int __stdcall MaFonction2 (int); #ifdef __cplusplus } #endif #endif C++ (@++)
|
|
lundi 6 août 2007 à 18:04:41 |
Re : importer une fonction depuis un dll externe

Rabbi Jakob
|
Oui, j'ai exactement le schéma que tu m'as dit; a priori, je pense que le fichier .h qui m'a été donné est bon, puisque ce n'est pas moi qui l'ai fait lol. Ce que je trouve étrange, c'est que si je ne mets pas le extern "C"declspec(dllimport) FonctionSimple(double, double), que je mette juste le header MaDll.h, et que j'appelle FonctionSimple(1.2), il me sort que FonctionSimple ne fonctionne pas avec un seul double. En revanche, si je mets FonctionSimple(1.2,5..3), là il me met l'erreur LNK2001 comme quoi il ne connaît pas la fonction. De plus, quand je tape FonctionSimple( Visual Studio me met qu'il faut que je rentre 2 doubles. C'est signe qu'il connaît déjà le prototype de la fonction, non? Donc a priori, je ne devrai avoir besoin de réécrire le prototype en début de programme, normalement?
|
|
lundi 6 août 2007 à 18:52:06 |
Re : importer une fonction depuis un dll externe

SAKingdom
|
Les prototypes sont bien déclarés dans le .h. Inutile d'en ajouter. L'erreur survient lors du linkage. Le linker ne trouve pas la fonction dans les lib que tu lui donne. Soit la lib n'est pas correcte (ce qui m'étonnerais), soit tu as fais une erreur quand tu l'as ajouté. Essais d'ajouter ceci dans le code #pragma comment(lib, "malib.lib") Exemple: #include <windows.h> #include "malib.h" #pragma comment(lib, "malib.lib") C++ (@++)
|
|
mardi 7 août 2007 à 10:07:41 |
Re : importer une fonction depuis un dll externe

Rabbi Jakob
|
J'ai essayé ton code, et il me sort cette fois-ci l'erreur LNK2019. J'ai regardé si ça pouvait être dû à une erreur dans la convention d'appel (std_call,...) .J'ai regardé mon fichier .h, parce que le schéma de mon header MaLib.h n'est pas exactement comme celui que tu m'as précisé, les prototypes de mes fonctions se présentent comme ça: _FSSAPI_decl double FonctionSimple( double, double); , il n'y a pas le __stdcall dont tu parlais tout à l'heure. En revanche, dans l'output de mon debugger,, il me marque unresolved external symbol"__declspec(dllimport) double __cdecl FonctionSimple(double, double)". Je pense que c'est parce que les fonctions ne sont pas définies dans une classe. Je ne sais pas si dans ce cas il faut faire une procédure d'appel spécial, ce que m'étonnerait puisque la procédure d'appel __cdecl à l'air d'être la procédure d'appel par défaut.
Je viens aussi d'essayer le #pragma (linker,"/DEFAULTLIB:MaLib.lib"), parce que windows.h redéfinit le type BOOLEAN qui est déjà défini dans MaDll.h (sous winnt.h, BOOLEAN est un BYTE, sous MaLib.h, c'est un char), mais ça n'a pas avancé le problème apparemment.
J'ai aussi essayé d'enlever le header windows.h, pour éviter les rédéfinitions, et là il me ressort l'erreur LNK2019, et de même si je mets le #pragma comment(lib, "MaLib.lib") et que j'enlève MaLib.lib des additional dependencies de mon projet afin d'éviter une éventuelle redéfinition. En revanche, je ne vois pas trop à quoi cela sert d'ajouter le header windows.h à mon projet. Il est nécessaire à l'appel d'une dll externe?
J'ai enfin essayé une autre solution: comme ma dll a été écrit en C et que je code en C++, j'ai essayé de mettre un extern "C" (sans __declspec(dllimport)) devant le prototype de la fonction, mais là encore sans succès (C2732, redéfinition des fonctions). Je vais regarder en mode verbeux si j'obtiens quelquechose de plus consistant....
|
|
mardi 7 août 2007 à 13:50:06 |
Re : importer une fonction depuis un dll externe
|
mardi 7 août 2007 à 14:27:39 |
Re : importer une fonction depuis un dll externe

Rabbi Jakob
|
Réponse acceptée !
j'ai finalement pu trouver ce qui n'allait pas. Il y avait dans un fichier en-tête appelé par MaLib.h un #define _FSSAPI_decl __declspec( dllimport) et je l'ai remplacé par _FSSAPI_decl extern"C"__declspec( dllimport) C'était donc une erreur dans la dl qui m'a été fournie apparemmenr(je dis apparemment, car j'ai juste fait un essai avec 2 fonctions, j'espère que je ne me suis pas trompé)  . Merci à SAKingdom pour son attention, bonne journée à tous!! Peace and tranquillity on earth  PS: Au fait, désolé pour les changements de taille de police dans le poste d'avant, mais je sais pas comment faire un édit pour modifier tout ça.
|
|
Cette discussion est classée dans : problème, fonction, dll, extern, mafonction
Répondre à ce message
Sujets en rapport avec ce message
TCppWebBrowser dans une DLL [ par norton ]
Bonjour à tous, je développe une application qui utilise le composant TCppWebBrowser.Jusque la aucun problème mais des que j'appelle la fonction LoadF
Problème de retour de dll sous l’API32 [ par ArthurAuguste ]
J’ai un .exe (une fenêtre) qui tourne donc avec quelque part une boucle : while( GetMessage( &message, NULL, 0, 0)) { TranslateMessage( &message );
Problème pendant link avec dll [ par svince ]
Bonjour, Je travaille sous Eclipse/Windows en C++. J'ai créé une dll à partir d'un premier projet. Je souhaite utiliser cette dll dans un second proj
Problème avec GetOpenFileName enfin élucidé [ par ArthurAuguste ]
Je viens enfin d'élucider ce problème qui au vu des messages de ce site a beaucoup été lu, mais sur lequel je n'ai pas beaucoup eu de réponse. Voici c
arrêt imprévu de thread [ par mayssakh84 ]
Bonjour, J'ai une fonction appelé dasn un thread qui fait appel à une fonction chargée à partir d'une dll. Mon problème c'est que parfois , le thread
probleme de dll [ par mana ]
Bonjour, j'ai crée une dll qui fonctionne . Dés que j'essaie d'y inclure les lib., stl ou sfml, codeblocks la compile sans problème , mais quand je v
Problème génération fichier lib sous VC++ [ par tntk ]
Bonjour à tous Encore une foie c'est moi [^^confus2], Sous Visual C++ j'arrive bien à upgrader des fonctions C en C++ dans un projet DLL (Win32 Dynam
Problème Fonction de calcul d'un déplacement [ par baptchr55 ]
Bonjour à tous... J'ai encore une fois besoin de votre aide : Je travail sur une machine CNC de type UPA. Aujourd'hui j'ai pu déterminer comment comm
Problème création d'une fonction de Calcul d'un point [ par baptchr55 ]
Je travail sur une machine CNC de type UPA. Aujourd'hui j'ai pu déterminer comment commander celle-ci à l'aide d'un petit programme en C. Je souhaite
dll COM question!!! un truc qui me chiffone [ par darkpoulpo ]
bonjour, imaginons que nous avons, une dll avec une fonction qui créer une objet COM et la renvoi au programme X pour être utilisé... imagine que plu
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|