C++ utiliser une DLL dynamiquement

la progra cest mon dada -  
Char Snipeur Messages postés 10112 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

  1. Mahmah Messages postés 497 Statut Membre 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
  2. 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
  3. Mahmah Messages postés 497 Statut Membre 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
    1. 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
      1. 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
  4. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    renomme ta variable hhDLL.
    Ote nous d'un doute, tu n'as pas mis ce bout de code dans un .h, hein ?
    0