Rechercher : dans
Par :

C++ utiliser une DLL dynamiquement

Dernière réponse le 27 mar 2008 à 17:50:32 la progra cest mon dada, le 27 mar 2008 à 16:07:16 
 Signaler ce message aux modérateurs

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)

Meilleures réponses pour « C++ utiliser une DLL dynamiquement » dans :
Générer des nombres aléatoires efficacement avec rand() VoirGénérer des nombres aléatoires efficacement avec rand() Vous avez peut-être remarqué qu'en C, en utilisant la fonction rand() de la bibliothèque standard, vous obtenez des résultats décevants, trop souvent les mêmes. Prenons un exemple, vous...
Introduction à la STL en C++ (standard template library) VoirIntroduction Principales classes de la STL std::pair std::list std::vector std::set std::map Les iterators iterator et const_iterator reverse_iterator et const_reverse_iterator Les algorithmes ...
Utilisation des sémaphores Système V VoirIntroduction Il n'est pas forcément facile de trouver un mode d'emploi clair des sémaphores System V, surtout en français. Cette astuce ne se veut pas exhaustive, mais on va quand même essayer de débroussailler un peu le chemin et clouer quelques...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...

1

Mahmah, le 27 mar 2008 à 17:01:03
  • +1

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.

Répondre à Mahmah

2

la progra cest mon dada, le 27 mar 2008 à 17:45:39

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 !

Répondre à la progra cest mon dada

3

 Mahmah, le 27 mar 2008 à 17:50:32

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.

Répondre à Mahmah