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 !
A voir également:
Error c2106: '=' : left operand must be l-value
Farproc c++ - Meilleures réponses
Left operand must be l-value in c - Meilleures réponses
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...
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...
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...???
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...
// 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 !
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...
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...
{###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!
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...
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...)
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 ??