Bonjour,
Je cherche à créer une dll C++, pour exploiter ses fonctions avec Windev.
Voici comment je l'ai structurée :
un fichier dllmain.cpp :
un fichier dll.h :
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
46 #include <windows.h> #include <cstring> #include <fstream> #include <stdio.h> #include <time.h> #include "dll.h" using namespace std; extern "C" __declspec(dllexport) void Initial(); extern "C" __declspec(dllexport) void CleanUp(); extern "C" __declspec(dllexport) void SetProtocol( char * sProtocol ); extern "C" __declspec(dllexport) void SetServerAddress( char * sURL ); extern "C" __declspec(dllexport) void SetUser( char * sUser ); extern "C" __declspec(dllexport) void SetPassword( char * sPassword ); extern "C" __declspec(dllexport) void UploadFile( char * sFilePath ); extern "C" __declspec(dllexport) void SetFullURLConnect( char * sFullURL ); BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; }
et un fichier dll.cpp
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 #define _DLL_H_ #include <curl/curl.h> #include <curl/easy.h> #include <string.h> #if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else /* Not BUILDING_DLL */ # define DLLIMPORT __declspec (dllimport) #endif /* Not BUILDING_DLL */ class DLLIMPORT DllClass { private: long Get_Size( char * ); char* _sProtocol; char* _sURL; char* _sUser; char* _sPassword; char* _sFullURL; CURL *curl; public: DllClass(); virtual ~DllClass(void); void Initial(); void CleanUp(); void SetProtocol( char * ); void SetServerAddress( char * ); void SetUser( char * ); void SetPassword( char * ); char* UploadFile( char * ); void SetFullURLConnect( char * sFullURL ); void EcritLog( char* , char*, DllClass *); }; #endif /* _DLL_H_ */
Le problème c'est que mon programme Windev me renvoie que la fonction n'existe pas lorsque j'exécute :
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59 #include "dll.h" // Constructeur DllClass::DllClass() { (...) } // Destructeur DllClass::~DllClass () { (...) } void DllClass::Initial() { (...) } void DllClass::CleanUp() { (...) } long DllClass::Get_Size( char * path ) { (...) } void DllClass::EcritLog( char * aTexte, char * aMode, DllClass *Pointeur ) { (...) } void DllClass::SetProtocol( char * sProtocol ) { (...) } void DllClass::SetServerAddress( char * sServerAddress ) { (...) } void DllClass::SetUser( char * sUser ) { (...) } void DllClass::SetPassword( char * sPassword ) { (...) } void DllClass::SetFullURLConnect( char * sFullURL ) { (...) } // Returns an error code char * DllClass::UploadFile( char * sFilePath ) { (...) }
Comment faire le lien entre les fonctions de la dll et ma classe DllClass ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 iHandle est un entier long iHandle = ChargeDLL(fRepExe()+"\test_dll.dll") AppelDLL32(fRepExe() + "\test_dll.dll", "Initial" )
Merci d'avance de votre aide
______________________________________________________
Si je modifie mon programme de la sorte :
dllmain.cpp :
Les fonctions de la dll existent pour Windev (pas d'erreur de ce côté), mais si j'affiche les propriétés de mon objet elle ont toutes la même valeur alors que je les ai défini avec des valeurs différentes...
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 /* Replace "dll.h" with the name of your header */ #include <windows.h> #include <cstring> #include <fstream> #include <stdio.h> #include <time.h> #include "dll.h" using namespace std; extern "C" __declspec(dllexport) void Initial(); extern "C" __declspec(dllexport) void CleanUp(); extern "C" __declspec(dllexport) void SetProtocol( char * sProtocol ); extern "C" __declspec(dllexport) void SetServerAddress( char * sURL ); extern "C" __declspec(dllexport) void SetUser( char * sUser ); extern "C" __declspec(dllexport) void SetPassword( char * sPassword ); extern "C" __declspec(dllexport) void UploadFile( char * sFilePath ); extern "C" __declspec(dllexport) void SetFullURLConnect( char * sFullURL ); DllClass *cldll = NULL; extern "C" __declspec(dllexport) void Initial() { cldll = new DllClass(); time_t rawtime; struct tm * timeinfo; cldll->EcritLog( "\n_________________________\n", "%s" , NULL ); time ( &rawtime ); timeinfo = localtime ( &rawtime ); cldll->EcritLog( asctime (timeinfo), "%s" , NULL ); cldll->EcritLog( "Init()\n", "%s" , NULL ); cldll->EcritLog( "Init() - Pointeur : ", "%s" , NULL ); cldll->EcritLog( "", "%x\n", cldll ); cldll->Initial(); } extern "C" __declspec(dllexport) void CleanUp() { cldll->CleanUp(); } extern "C" __declspec(dllexport) void SetProtocol( char * sProtocol ) { cldll->SetProtocol( sProtocol ); } extern "C" __declspec(dllexport) void SetServerAddress( char * sURL ) { cldll->SetServerAddress(sURL); } extern "C" __declspec(dllexport) void SetUser( char * sUser ) { cldll->SetUser( sUser ); } BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; }
Il garde pour toutes les propriétés la dernière valeur que j'ai passé.
Partager