Bonjour,
je compile sans soucis des dll en c mais j'ai un problème avec le point suivant.
Tout d'abord mon environnement de développement:
winXp, gcc 4.0.0_1
J'intègre les dll que je développe à des programme c++ (avec Qt 4.6.2)
Ci dessous le code minimal d'une dll qui export une fonction dispHello (qui affiche "hello")
On trouve également la fonction DllMain appelée lorsque que l'on charge ou décharge la dll.
Mon problème est le suivant: Si je veux appeler des fonctions dans DllMain, je suis obligé de les définir dans le même fichier que celui de DllMain. Si je déclare la fonction dans un .h et je la féfinis dans un autre fichier, le compilateur retournera un fonction undifined.
La compilation du code ci-dessous provoque cette erreur avec la fonction test. Mais ça marche si je copie/colle la définition de test au-dessus de celle de DllMain.
Qu'est ce qui ne va pas d'après vous?
mainDll.h
main.c
Code : 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
26
27
28
29
30
31 #ifndef __MAIN_H__ #define __MAIN_H__ #include <stdio.h> #include <windows.h> /* To use this exported function of dll, include this header * in your project. */ #ifdef BUILD_DLL #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT __declspec(dllimport) #endif void test(void); #ifdef __cplusplus extern "C" { #endif void DLL_EXPORT dispHello(void); #ifdef __cplusplus } #endif #endif // __MAIN_H__
test.c
Code : 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 #include "mainDll.h" // a sample exported function void DLL_EXPORT dispHello(void) { printf("Hello world\n"); } extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // attach to process #ifdef DEBUG printf("DLL_PROCESS_ATTACH\n"); #endif test(); // return FALSE to fail DLL load break; case DLL_PROCESS_DETACH: // detach from process #ifdef DEBUG printf("DLL_PROCESS_DETACH\n"); #endif break; case DLL_THREAD_ATTACH: // attach to thread #ifdef DEBUG printf("DLL_THREAD_ATTACH\n"); #endif break; case DLL_THREAD_DETACH: // detach from thread #ifdef DEBUG printf("DLL_THREAD_DETACH\n"); #endif break; } return TRUE; // succesful }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include "mainDll.h" void test(void) { printf("test"); }
Partager