C++ utiliser une DLL dynamiquement
Fermé
la progra cest mon dada
-
27 mars 2008 à 16:07
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 18 déc. 2009 à 08:28
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 18 déc. 2009 à 08:28
A voir également:
- C++ utiliser une DLL dynamiquement
- Utiliser chromecast - Guide
- Utiliser une tablette comme ecran pc - Guide
- Utiliser iphone comme webcam - Guide
- Comment utiliser l'ia - Accueil - Guide Intelligence artificielle
- Votre pc ne peut pas utiliser un autre écran ✓ - Forum Montage et acquisition vidéo
4 réponses
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
27 mars 2008 à 17:01
27 mars 2008 à 17:01
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'
Variable: pointeur sur une fonction de type xvid_global_func.
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...)
Après l'une ou l'autre méthode:
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.
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.
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 !
et ça marche niquel et c'est beaucoup + propre.
merci beaucoup !
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
27 mars 2008 à 17:50
27 mars 2008 à 17:50
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.
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.
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
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
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)
Notamment sur le groupe de prog Windows https://www.ovh.co.uk/mail/
(experts Microsoft)
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
18 déc. 2009 à 08:28
18 déc. 2009 à 08:28
renomme ta variable hhDLL.
Ote nous d'un doute, tu n'as pas mis ce bout de code dans un .h, hein ?
Ote nous d'un doute, tu n'as pas mis ce bout de code dans un .h, hein ?