Utiliser les fonctions d'une DLL

cs_andrealphus Messages postés 46 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 21 décembre 2004 - 9 mai 2003 à 12:29
cs_andrealphus Messages postés 46 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 21 décembre 2004 - 12 mai 2003 à 15:28
[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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 mai 2003 à 12:43
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...
0
cs_andrealphus Messages postés 46 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 21 décembre 2004
9 mai 2003 à 16:06
[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++ ?)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 mai 2003 à 16:26
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...
0
cs_andrealphus Messages postés 46 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 21 décembre 2004
12 mai 2003 à 08:55
[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...???
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mai 2003 à 09:23
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...
0
cs_andrealphus Messages postés 46 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 21 décembre 2004
12 mai 2003 à 10:39
[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 !
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mai 2003 à 10:50
MAKELPARAM est invalide dans un def. Mets direct le resultat.
MAKELPARAM est une macro pour le compilo, pas pour le linker.
BruNews, ciao...
0
cs_andrealphus Messages postés 46 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 21 décembre 2004
12 mai 2003 à 11:16
[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 ???
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mai 2003 à 11:32
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...
0
cs_andrealphus Messages postés 46 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 21 décembre 2004
12 mai 2003 à 11:40
[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 ???
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mai 2003 à 11:48
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...
0
cs_andrealphus Messages postés 46 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 21 décembre 2004
12 mai 2003 à 12:28
[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!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mai 2003 à 13:05
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...
0
cs_andrealphus Messages postés 46 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 21 décembre 2004
12 mai 2003 à 14:08
[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...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mai 2003 à 14:22
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...
0
cs_andrealphus Messages postés 46 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 21 décembre 2004
12 mai 2003 à 14:45
[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...)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mai 2003 à 14:49
probleme sur les registres ???
Rappelle moi de quoi y retourne.
BruNews, ciao...
0
cs_andrealphus Messages postés 46 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 21 décembre 2004
12 mai 2003 à 15:28
[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 ??
0
Rejoignez-nous