Ordre des fonction dans le .def d'une DLL

Résolu
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008 - 7 nov. 2004 à 21:38
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 - 8 nov. 2004 à 13:18
Bonjour je voudrais savoir comment déterminer l'ordre que vont avoir les fonctions d'une dll dans le fichier .def.

Car pour l'instant j'ai défini 3 fonctions dans cet ordre dans mon maindll.c :
/code

__declspec(dllexport) int verifdll()
{
//code ....
}

__declspec(dllexport) int closedevice()
{
//code ....
}

__declspec(dllexport) int opendevice()
{

//code ....

}

/code

Et je les retrouve dans cet ordre dans le .def:

opendevice @ 1 ;
verifdll @ 2 ;
closedevice @ 3 ;

Le problème vient donc lors de l'utilisation, lorsque j'apelle mes fonctions avec:

DMXconnectdevice = GetProcAddress((HINSTANCE)hModDll,(LPCSTR)2);

je me retrouve jamais avec la même fonction, puisque quand je change ou que je rajoute une fonction dans ma dll, ça change l'ordre et donc le numéro.

Ce que je voudrais c'est arriver à déterminer un ordre fixe quand je compile ma dll, ou alors mieux, je préfèrerais arriver à appeler les fonctions de ma dll avec leur nom et pas leur numéros.

du genre :
DMXconnectdevice = GetProcAddress((HINSTANCE)hModDll,(LPCSTR)"connectdevice");

J'ai essayé ça ne marche pas, j'ai une erreur de lien.

http://www.rc-bot.com

6 réponses

cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
7 nov. 2004 à 22:17
Normalement faut caster le retour de GetProcAddress, oui...
611 DMXopendevice = (DMXOPENDEVICE) GetProcAddress((HINSTANCE) hModDll,"opendevice");

en supposant :
typdef VOID (* DMXOPENDEVICE)(INT, LPSTR);
static DMXOPENDEVICE DMXopendevice;
et tu utilises ensuite DMXopendevice comme une fonction normale.

Pour le premier warning, déclare hModDll en tant que HINSTANCE si ce n'est pas déjà fait.
3
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
7 nov. 2004 à 21:48
FARPROC GetProcAddress(
HMODULE hModule, // handle to DLL module
LPCSTR lpProcName // name of function
);

lpProcName = au choix ordinal ou nom, pourquoi compliquer et utiliser ordinal, nom marchera toujours.
0
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008
7 nov. 2004 à 22:04
Ah ah, ça marche, je sais pas ce que j'avais tenté la première fois avec mes noms pour que ça ne fonctionne pas mais maintenant elles sont reconnues.

J'ai donc mis le code suivant:
608    hModDll = LoadLibrary("Interfaces/OpenDMX-USB.dll");
611    DMXopendevice = GetProcAddress((HINSTANCE) hModDll,"opendevice");
612    DMXverifdll = GetProcAddress((HINSTANCE)hModDll,"verifdll");
613    DMXclosedevice = GetProcAddress((HINSTANCE)hModDll,"closedevice"); 


J'ai ces quatres warnings là
Main.c:608: warning: assignment makes integer from pointer without a cast
Main.c:611: warning: assignment from incompatible pointer type
Main.c:612: warning: assignment from incompatible pointer type
Main.c:613: warning: assignment from incompatible pointer type

Pour le premier ça doit pas être bien méchant je dois faire un cast faut juste que je cherche le bon type, je vais aller voir sur la msdn.

Mais pour les trois autres, ils n'empèchent pas le programme de fonctionner mais je voudrais savoir d'où ils viennent, car des warnings c'est pas très beau dans une compil.

http://www.rc-bot.com
0
Mastersam Messages postés 116 Date d'inscription dimanche 26 septembre 2004 Statut Membre Dernière intervention 13 février 2008
7 nov. 2004 à 22:33
Voilà merci beaucoup Nebula, plus de warnings, mes fonctions sont bien définies, bref tout marche bien.

Suite au prochain épisode ... Je dois utiliser un thread pour envoyer des données à l'interface qui est pilotée par la dll, ça promet encore d'être "amusant" .

D'ici là, bonnes journées et encore merci.

http://www.rc-bot.com
0

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

Posez votre question
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
8 nov. 2004 à 10:06
pour mémoire

ça permet de faire des lib uniquement C, pas C++
et ne supporte pas les surdéfinitions de fonctions, C bien ça?
++
l'informagicien!
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
8 nov. 2004 à 13:18
Aucune idée, jamais fait de C++
0
Rejoignez-nous