Exemple pour la fonction FTW_Acq_GetImage() :
Evidemment, ce n'est pas optimisé: J'ouvre la DLL pour appeler UNE fonction.
Dans le vrai programme, il serait plus judicieux de charger la DLL au démarrage, et:
- soit de garder son handle en variable globale (ou le passer en paramètre à chaque fois) et faire un GetProcAdress() pour chaque fonction utilisée
- soit de charger toutes les fonctions dans des pointeurs de fonctions enregistrés en variables globales (ou dans une structure dont on passerait tout le temps le pointeur en paramètre)
Comme indiqué, ça ne marche que si la fonction est en extern "C" dans la DLL. Si ce n'est pas le cas, tu seras bien forcé d'utiliser .Net (par exemple, avec le code des exemples C# pour utiliser la DLL...)
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 //int FTW_Acq_GetImage( HANDLE& hDib, int& count ); typedef int (*FTW_ACQ_GETIMAGE_PROC)( HANDLE &, int & ); //Nom extern "C" de la fonction : //Si la fonction est en __cdecl #define FTW_ACQ_GETIMAGE_NAME "FTW_Acq_GetImage" //Si la fonction est en __stdcall, ce qui est probable pour une DLL #define FTW_ACQ_GETIMAGE_NAME "_FTW_Acq_GetImage@8" //Si la fonction est en __fastcall, ce qui n'arrive pratiquement jamais #define FTW_ACQ_GETIMAGE_NAME "@FTW_Acq_GetImage@8" void uneFonction() { HMODULE hMod = LoadLibrary( TEXT("FayaTwain.dll") ); if(hMod != NULL) { //Ce code ne peut marcher que si la fonction est en extern "C" dans la DLL. //Et encore, même en extern "C", il y a trois noms possibles: voir plus haut FTW_ACQ_GETIMAGE_PROC FTW_Acq_GetImage_proc = GetProcAddress(FTW_ACQ_GETIMAGE_NAME); FTW_Acq_GetImage_proc( /* paramètres */ ); FreeLibrary(hMod); } }
Edit: Mais si j'en crois le code C#, le premier nom doit marcher...
Partager