C++ utiliser une DLL dynamiquement

la progra cest mon dada -  
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

j'aimerais utiliser la DLL de xvid (xvidcore.dll)

j'ai bien compris comment charger la DLL:

HINSTANCE hDLL=LoadLibrary("xvidcore.dll");

et récupérer l'adresse de la fonction :

void *pxvid_global=GetProcAddress(hDLL,"xvid_global");

dans les entêtes xvid.h j'ai ça :

extern int xvid_global(void *handle, int opt, void *param1, void *param2);

maintenant comment appeler cette fonction naturellement ?

genre : xvid_global(0,XVID_GBL_INIT,xinit,0);

en attendant j'utilise ça :

__asm
{
push 0
push xinit
push XVID_GBL_INIT
push 0
call pxvid_global
}

doit avoir plus propre non ?

merci de votre aide !!!

(C++ visual studio 2005)

4 réponses

Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention   125
 
Bonjour,

En déclarant une variable pour accueillir ton pointeur avec le bon type cela devrait simplifier l'écriture.

Type xvid_global_func : 'fonction du prototype de xvid_global'
typedef int xvid_global_func(void *, int, void *, void *);


Variable: pointeur sur une fonction de type xvid_global_func.
xvid_global_func *pxvid_global = (xvid_global_func*) GetProcAddress(hDLL,"xvid_global");


ou alors... tout d'un coup pour éviter de déclarer le type pour une initialisation... (Moi je préfère déclarer le type...)

int (*pxvid_global)(void *, int, void *, void *) = (int (*)(void *, int, void *, void *)) GetProcAddress(hDLL,"xvid_global");


Après l'une ou l'autre méthode:
if ( pxvid_global != NULL )
   int returnedValue = pxvid_global( pouet, pouat, pouit, pouot );


Quand j'ai à faire ce genre de chose je fais une grosse fonction d'initialisation pour toutes les fonctions d'une dll pour mettre à jour des pointeurs de fonctions globaux et faire les vérification, après il n'y a ainsi plus qu'à utiliser les pointeurs comme des fonction normales.

M.
1
la progra cest mon dada
 
j'ai utilisé la 1ere méthode (+ l'initialisation au démarrage comme toi)

et ça marche niquel et c'est beaucoup + propre.

merci beaucoup !
0
Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention   125
 
Mais de rien. ^^

Ce qui reste ch*** à gérer c'est lorsqu'il peut y avoir plusieurs versions de la dll et que certaines fonctions n'existaient pas encore dans la version de la dll chargée. On se retrouve avec la moitié de ses pointeurs à NULL...

M.
0
Thom314
 
Bonjour,

J'ai tenté d'utiliser vos exemples pour arriver à utiliser les fonctions d'une DLL sous Visual C++

Voici mon code :

HINSTANCE hhDLL=LoadLibrary(L"HID class.dll");
typedef void (CALLBACK* USBHIDClassInit_fct) (int,int,int);
typedef bool (CALLBACK* USBHIDWriteReport_fct) (int*,int);
typedef bool (CALLBACK* USBHIDReadReport_fct) (int*);
typedef bool (CALLBACK* IsConnected_fct) (void);

USBHIDClassInit_fct *pUSBHIDClassInit = (USBHIDClassInit_fct*) GetProcAddress(hhDLL,"USBHIDClassInit");
USBHIDWriteReport_fct *pUSBHIDWriteReport = (USBHIDWriteReport_fct*) GetProcAddress(hhDLL,"USBHIDWriteReport");
USBHIDReadReport_fct *pUSBHIDReadReport = (USBHIDReadReport_fct*) GetProcAddress(hhDLL,"USBHIDReadReport");
IsConnected_fct *pIsConnected = (IsConnected_fct*) GetProcAddress(hhDLL,"IsConnected");


Mais j'ai quelques erreurs :

1>Accueil.obj : error LNK2005: "struct HINSTANCE__ * hhDLL" (?hhDLL@@$$Q3PAUHINSTANCE__@@A) déjà défini(e) dans GenericHIDSimpleDemo.obj
1>Accueil.obj : error LNK2005: "void (__stdcall** pUSBHIDClassInit)(int,int,int)" (?pUSBHIDClassInit@@$$Q3PAP6GXHHH@ZA) déjà défini(e) dans GenericHIDSimpleDemo.obj
1>Accueil.obj : error LNK2005: "bool (__stdcall** pUSBHIDWriteReport)(int *,int)" (?pUSBHIDWriteReport@@$$Q3PAP6G_NPAHH@ZA) déjà défini(e) dans GenericHIDSimpleDemo.obj
1>Accueil.obj : error LNK2005: "bool (__stdcall** pUSBHIDReadReport)(int *)" (?pUSBHIDReadReport@@$$Q3PAP6G_NPAH@ZA) déjà défini(e) dans GenericHIDSimpleDemo.obj
1>Accueil.obj : error LNK2005: "bool (__stdcall** pIsConnected)(void)" (?pIsConnected@@$$Q3PAP6G_NXZA) déjà défini(e) dans GenericHIDSimpleDemo.obj

Pouvez vous me donner quelques conseils, je ne sais plus quoi essayer, merci d'avance.

Thomas
0
Fred > Thom314
 
Demande chez les pros, ça a été expliqué des milliers de fois depuis 20 ans !!!
Notamment sur le groupe de prog Windows https://www.ovh.co.uk/mail/
(experts Microsoft)
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
renomme ta variable hhDLL.
Ote nous d'un doute, tu n'as pas mis ce bout de code dans un .h, hein ?
0