Utiliser les fonctions d'une DLL

Signaler
Messages postés
46
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
21 décembre 2004
-
Messages postés
46
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
21 décembre 2004
-
[mailto:david.leguillon@voila.fr 4ndr&@lphu$]

1)
en fait j'ai un premier probleme d'incompatiblité de mon include qui est fait avec borland et de mon programme avec VC++ 6.0.
Mais ca je l'ai normalement résolu en remplaçant:

//prototype d'une des fonctions
int FUNEXP IDN_OpenComm(IDN_DRVOPEN *idn_drvopen);

par

__declspec( dllexport ) int IDN_OpenComm(IDN_DRVOPEN *idn_drvopen);

2)
j'ai aussi chargé ma dll avec loadlibrary et utilisé getprocadress mais c'est justement sur ce dernier point que "ca se gate :

pour la fonction que j'ai mis dans l'exemple, j'ai créer un pointeur:

__declspec( export ) int (*pIDN_OpenComm)(IDN_DRVOPEN *idn_drvopen);

...et lorsque je copile tout ca,

j'obtient l'erreur suivante:
"error C2106: '=' : left operand must be l-value"
à la ligne:
(FARPROC)pIDN_OpenComm=GetProcAdress(hDll,...);

SVP AIdez moi je vais craquer...merci d'avence !

18 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Je te mets un exemple, un de mes anciens progs.
Dans la dll:
BOOL IsFreeScrab(const char* pszPath);
exporte grace a fichier def, que je prefere.
Dans prog appelant:
typedef BOOL (*ISFREESCRAB) (const char* pszPath);
ISFREESCRAB IsFreeScrab;
IsFreeScrab = (ISFREESCRAB)GetProcAddress(hDll, (LPCSTR)10);
BOOL bOK = IsFreeScrab(szfile); // licence valide ?
etc...
BruNews, ciao...
Messages postés
46
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
21 décembre 2004

[mailto:david.leguillon@voila.fr 4ndr&@lphu$]

j'ai un peu de mal à suivre ta démarche, et c'est koi un fichier def ?? (en msft visual c++ ?)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Quand tu fais une dll tu as d'autre moyen d'exporter des fonctions. Entre autre en faisant un fichier nomdll.def a incorporer dans le projet. Il permet d'exporter tes fonctions au format C standard sans decoration des noms.
Voila interieur:
LIBRARY "ServScra"
DESCRIPTION 'ServScra Windows Dynamic Link Library'

EXPORTS
IsFreeScrab @10 NONAME
About @11 NONAME
BruNews, ciao...
Messages postés
46
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
21 décembre 2004

[mailto:david.leguillon@voila.fr 4ndr&@lphu$]

c'est ok pour le fichier def mais maintenant on retombe qd meme sur mon premier probleme:
à la ligne mon_pointeur_sur_fonction=GetProcAdress(hDll,numéro); , le compilateur me balance une erreur left operand must be l-value , or je ne voit pas ce qui peut le mieux pointé un espace mémoire à part un pointeur ???
(prototype de ma fonction-pointeur: int (*mon_pointeur_sur_fonction)(mes_parametres); )
Si tu ne sais j'en déduirai que mon compilateur a vraiment une dent contre moi...???
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Et tu as exactement repris la meme syntaxe que dans mon exemple ? Je n'ai jamais rencontre de prob en procedant ainsi. Verifie bien les declarations.
BruNews, ciao...
Messages postés
46
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
21 décembre 2004

[mailto:david.leguillon@voila.fr 4ndr&@lphu$]

maintenat c'est ok pour mes fonctions, mais j'ai un probleme d'exportation dans le fichier def (j'ai pas mis grand chose encore)
voila mon prog:

mon fichier '.h':
typedef int (*PIDN_OPENCOMM) (IDN_DRVOPEN *p_open);
typedef int (*PIDN_CLOSECOMM) (int ixdrv);

PIDN_OPENCOMM pIDN_OpenComm;
PIDN_CLOSECOMM pIDN_CloseComm;
// ici y a pas de pb

mon fichier '.cpp':
// load librery
hDll = LoadLibrary("idndll.dll");

// get address of function
pIDN_OpenComm = (PIDN_OPENCOMM)GetProcAddress(hDll,(LPCSTR)MAKELPARAM(1,0));

pIDN_CloseComm = (PIDN_CLOSECOMM)GetProcAddress(hDll,(LPCSTR)MAKELPARAM(2,0));
//pas de pb ici non plus

mon fichier '.def':
LIBRARY "ServScra"
DESCRIPTION 'ServScra Windows Dynamic Link Library'

EXPORTS
IDN_OpenComm @MAKELPARAM(1,0) NONAME
IDN_CloseComm @MAKELPARAM(2,0) NONAME
//c'est là que ca déconne...(il me sort:.\idndll.def : fatal error LNK1119: invalid ordinal number "MAKELPARAM(1,0)") ! j'ai fait comme toi sauf que toi c'était un peu plus simple, moi j'ai voulu bricoler un peu...
(attention, les MAKELPARAM(...) du fichier '.cpp' est la seule infos que j'ai concernant les numéros ordinaux de mes fonctions ds ma dll)
j'attends ton aide avec impatience...
et merci d'avance !
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
MAKELPARAM est invalide dans un def. Mets direct le resultat.
MAKELPARAM est une macro pour le compilo, pas pour le linker.
BruNews, ciao...
Messages postés
46
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
21 décembre 2004

[mailto:david.leguillon@voila.fr 4ndr&@lphu$]

je veux bien mais j'aimerais bien savoir comment je peux obtenir le résultats d'un truc si je ne peux pas le faire ???
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Si tu veux les appeler en mode ordinaire par nom tu enleves NONAME.
Change aussi "ServScra" par un nom a toi.
EXPORTS
IDN_OpenComm @1
IDN_CloseComm @2
BruNews, ciao...
Messages postés
46
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
21 décembre 2004

[mailto:david.leguillon@voila.fr 4ndr&@lphu$]
et voila la derniere...idndll.def : error LNK2001: unresolved external symbol IDN_CloseComm

est ce qu'il faut que j'enleve le MAKELPARAM de mon 'cpp' ausii et que je mette directement le nom de la fonction ???
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Quel MAKELPARAM du cpp ?
voici un truc + recent, calcul nombres infinis pour VB passes en string:
dans le cpp de dll:
long __stdcall bnAdd(BSTR *a, BSTR *b)
{
.....
}
et les autres du meme genre.
dans le def:
LIBRARY bnMaths
EXPORTS
bnCompare @1
bnAdd @2
bnSub @3
bnMul @4
bnDiv @5
BruNews, ciao...
Messages postés
46
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
21 décembre 2004

[mailto:david.leguillon@voila.fr 4ndr&@lphu$]

{###j'ai l'impression que je ne vais jamis en voir la fin###}
récapitulons:
le MAKELPARAM se situe ds mon fichier'.cpp' ds le GetProcAddress (voir quelques messages + bas)
en sachant les 2 définition suivantes:
1)define MAKELPARAM(l,h) (LPARAM)MAKELONG(l,h)

2)#define MAKELONG(a, b) ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))

ensuite, je préfèrerai faire avec ca si ca ne te dérange pas parce que je commence à avoir l'impression de tourner en rond pour untruc qui parait pourtant assez simple!
donc peux tu STP m'expliquer comment je doit faire mon def et mon getprocaddress à partir de ce qu je t'ai dis dans mes 4 à 5 dernier msg.

je te remercie d'avance tres sincerement et je m'excuse si je ne suis pas toujours tres clair et si j'es vraiment beaucoup de mal!
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
cpp de idndll.dll:
int __stdcall IDN_OpenComm(IDN_DRVOPEN *idn_drvopen)
{
....
}
-----------------------
idndll.def :
LIBRARY idndll
EXPORTS
IDN_OpenComm @1
-----------------------
typedef BOOL (*IDN_OPENCOMM) (IDN_DRVOPEN *idn_drvopen);
IDN_OPENCOMM IDN_OpenComm;

2 formes possibles:
1) IDN_OpenComm = (IDN_OPENCOMM)GetProcAddress(hDll, (LPCSTR)1);
2) IDN_OpenComm = (IDN_OPENCOMM)GetProcAddress(hDll, "IDN_OpenComm");

IDN_DRVOPEN idnop;
int val = IDN_OpenComm(&idnop);

BruNews, ciao...
Messages postés
46
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
21 décembre 2004

[mailto:david.leguillon@voila.fr 4ndr&@lphu$]

et bah ca marche toujours pas:
idndll.def : error LNK2001: unresolved external symbol IDN_CloseComm
idndll.def : error LNK2001: unresolved external symbol IDN_OpenComm
idndll.def : error LNK2001: unresolved external symbol IDN_SetNTDriver
Debug/bidule_truc_thelast.lib : fatal error LNK1120: 3 unresolved externals
LINK : fatal error LNK1141: failure during build of exports file
Error executing link.exe.
Creating browse info file...

bidule_truc_thelast.exe - 5 error(s), 2 warning(s)

pourtant j'ai fais exactement tout ce que tu m'a dit...????
si t'arrive à trouver, je suis tout ouïe...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
deja compile toujours en release.
Le prob est bien a la compile de la dll ?
Si encore prob, tu me zip le cpp et le def que je le compile chez moi, jamais vu qu'une dll voulait pas se faire. Doit y avoir autre chose.
bnutiles@wanadoo.fr
BruNews, ciao...
Messages postés
46
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
21 décembre 2004

[mailto:david.leguillon@voila.fr 4ndr&@lphu$]

non Scuz, j'avais laisser une mauvaise méthode dans un des '.h', il devait y avoir un conflit. Maintenant j'ai 0 error à la compile, j'ai plus qu'à testé ma liaison.
merci et à la prochaine
(si tu veux bien revoir mon probleme sur les registres ca m'arrangerai...)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
probleme sur les registres ???
Rappelle moi de quoi y retourne.
BruNews, ciao...
Messages postés
46
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
21 décembre 2004

[mailto:david.leguillon@voila.fr 4ndr&@lphu$]

attends un peu la G un probleme avec le fichier '.def',
il faut le mettre ou ? moi je l'est intercaler dans mon projet mais le compilateur m'a sortie une erreur 193 (could not execute: Bed executable format), sais tu ou je dois l'insérer pour faire fonctionner corrctement mon proG ??