Linker une dll sous dev-c++

the diouk Messages postés 21 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 25 mai 2005 - 13 mai 2005 à 17:42
the diouk Messages postés 21 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 25 mai 2005 - 16 mai 2005 à 17:51
petite question toute bête mais qui me gêne :

j'utilise une DLL, dans ma source il y a bien :

#define TRUCDLL "TRUC.dll";

le prototype de la fonction :

int __stdcall Bidule(int trucmuche);

j'ai fait projet/option du projet/paramètres et dans l'éditeur de lien j'ai cherché ma dll mais je me demande si c'est bien là vu qu'il propose des .lib , mais sinon je sais pas ou il faut linker.....

en tout cas çà marche pas : quand j'appel la fonction il me met :

[Linker error] undefined reference to [mailto:`Bidule@4' `Bidule@4']

donc pour lui elle n'est pas linkée ? ou je l'appelle mal ??

merci si quelqu'un peut me donner un coup de pousse

Easy love Baby

9 réponses

the diouk Messages postés 21 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 25 mai 2005 1
16 mai 2005 à 12:02
effectivement je doit utiliser tout ce qui est getprocaddress, loadlibrary...

j'ai regardé ton exemple, mais je dois bien avoué que je n'est rien compris, alors j'ai cherché des tutoriaux, je pensais avoir réussi mais la fonction ne renvoi rien ou alors elle n'est même pas appelée

peux-tu regardé si mon prog de test est a peu près correct stp car moi je ne vois pas d'erreur flagrante

merci d'avance

#include
#include <stdlib.h>
#include<myconio.h>
#include<windows.h>


#ifdef __cplusplus
extern "C" {
#endif



#define IgorUSBDLL "IgorUSB.dll";

#define NO_ERROR 0;
#define DEVICE_NOT_PRESENT 1;
#define NO_DATA_AVAILABLE 2;
#define INVALID_BAUDRATE 3;
#define OVERRUN_ERROR 4;


//int __stdcall DoGetInDataPort(unsigned char * DataInByte);
//int __stdcall DoSetDataPortDirection(unsigned char DirectionByte);
//int __stdcall DoSetRS232Baud (int BaudRate);
//int __stdcall DoGetRS232Baud(int * BaudRate);


#ifdef __cplusplus
}
#endif


typedef INT (CALLBACK* DLLFUNC1)(INT);



HINSTANCE hDLL;
DLLFUNC1 DllFunc1;


main(void)
{
int j=9600,i=0;
hDLL = LoadLibrary("IgorUSBDLL");
if (hDLL != NULL)
{
DllFunc1 = (DLLFUNC1)GetProcAddress(hDLL, "DoSetRS232Baud");
if (!DllFunc1)FreeLibrary(hDLL);

else i = DllFunc1(j);
}

// i=DoSetRS232Baud(j);
printf("%d", j);
getch();
printf("%s",i);
getch();
}

y a pas mal de truc en commentaire car je n'arrête pas de tecter différentes possibilités d'appels de fonction
Easy love Baby
1
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
13 mai 2005 à 18:48
Je ne vois pas a quoi peut bien servir ton défine...

Je n'ai pas très bien compris, tu veux utiliser une DLL dans ton projet c'est ca?

Dans ce cas il te faut effectivement la lib correspondante, sinon tu
dois aller chercher les fonctions toit même dans la DLL avec
GetProcAdress

Exemple:http://www.cppfrance.com/code.aspx?ID=24723
0
the diouk Messages postés 21 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 25 mai 2005 1
16 mai 2005 à 11:56
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 mai 2005 à 14:20
Ca dépend de la manière dont sont écrit les fonctions de la DLL
(__stdcall, __fastcall ou __cdecl). En __stdcall le nom des fonctions
est modifié: une fonction f qui prend des arguments de taille n sera
décorée en _f@n.

Ce code devrait t'aider:

http://www.cppfrance.com/code.aspx?ID=25603

Tu peux aussi lire ceci:

http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/vccore/html/_core_.2f.gd.2c_2f.gr.2c_2f.gz.asp



A partir du moment ou GetProcAdress te donne une valeur non nulle, c'est que la fonction à été bien trouvée
0

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

Posez votre question
the diouk Messages postés 21 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 25 mai 2005 1
16 mai 2005 à 15:41
justement comment connaîs tu la valeur de retour de GetProcAddress ? là je fais

if (hDLL != NULL)
{
DllFunc1 = (DLLFUNC1)GetProcAddress(hDLL, "[mailto:_DoSetRS232Baud@3 _DoSetRS232Baud@3]");
if (!DllFunc1)
{
FreeLibrary(hDLL);
printf("çà a foirré");
getch();
}

else i = DllFunc1(9600);
}
et ça passe, mais même quand je modifie [mailto:_DoSetRS232Baud@3 _DoSetRS232Baud@3] il ne me marque pas que ça a foirré, et après i est toujours égal à zéro alors qu'il ne devrai pas.

d'ailleurs j'ai vu qu'il y avait un fichier .sys pour la communication par usb, faut-t-il que je le linke ( et alors comment linker un .sys ? ) où alors tu crois que c'est la DLL qui va s'en servir toute seule comme une grande ?

j'avoue que je suis un peu perdu avec touts ces trucs

merci déjà pour touts tes conseils, je suis en train de regarder les exemples même si c'est encore un peu du chinois je situe mieux comment ça marche
Easy love Baby
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
16 mai 2005 à 16:32
Pour connaitre la valeur de GetProcAdress, tu peux faire comme tu as fait: if(!DllFunc1) erreur...

Par contre c'est ton @3 qui m'étonne, a priori on a plutot des
multiples de 4. Pour le fichier sys, je sais pas comment ca se passe
mais a mon avis tu n'a pas à l'utiliser.

Est-ce que la DllFunc1 marche bien?
0
the diouk Messages postés 21 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 25 mai 2005 1
16 mai 2005 à 17:19
oui, je pense aussi que c'est un @4, c'était justement pour montrer que peut importe le nom que je donne à la fonction que j'appel, il me met jamais erreur pourtant si le nom n'est pas correct GetProcAdress devrai renvoyer NULL et donc je devrai voir que j'ai une erreur.

Et justement DllFunc1 renvoi toujour 0 ce qui signifie normalement que la fonction s'est exécutée sans problème or cette fonction communique par USB et j'ai fait exprès de ne pas le brancher, donc en toute logique si ça marchait il m'indiquerait DEVICE_NOT_PRESENT

tu ( je me permais de te tutoyer si ça ne te pose pas de problème ) ne crois pas que c'est GetProcAddress qui pose problème, je me demande si c'est la bonne méthode, mais en même temps vu que j'ai que le fichier Dll je ne vois pas d'autres méthodes

si ça peut te dire quelque chose, voici comment l'auteur de la DLL explique l'utilisation vite fait :

By this way we had successfully installed device IgorPlug-USB (AVR). And we can go to test it. For this purpose I had written DLL library "IgorUSB.dll", which contains functions, which device IgorPlug-USB (AVR) makes. This DLL library communicates with driver "IgorPlug.sys" and provide serialization of communication (when we are using DLL from more threads or applications). Library DLL is primary dedicated for programmers of end user applications for access to device: exported functions from DLL are published.

enfin voila, moi ça me dit rien de plus sur comment faire marcher ce truc...

Easy love Baby
0
the diouk Messages postés 21 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 25 mai 2005 1
16 mai 2005 à 17:37
je viens de faire une avancée : en fait il n'ouvrait même pas la DLL, comme un C . N j'avais mal marqué le nom.

mais il y a toujours ce problème de nom fonction, je continu mes essais....

Easy love Baby
0
the diouk Messages postés 21 Date d'inscription mercredi 13 avril 2005 Statut Membre Dernière intervention 25 mai 2005 1
16 mai 2005 à 17:51
allélouiah il y a un dieu pour forçonnés : en fait après avoir réglé le nom de la DLL, j'ai essayé sans coloration sur la fonction et ça MARCHE DU TONNERRE DE BREST

merci pour tes précieux exemples et conceils, a bientôt j'espère ( en même temps pas trop car ça voudra sans doute dire que je serais en train de galéré),en tout cas bonne continuation...

Easy love Baby
0
Rejoignez-nous