Bonjour a tous, voyez l'heure tardive a laquelle je vous parle et pour cause, je suis au japon pour l’été.
Je suis débutant en C++, langage que j'ai appris principalement par moi-même grâce a des tutoriels notamment.
J'ai pour projet de créer une GUI modulable a l'aide de DLL, pour qu'elle puisse gérer différents types de données. Je n'en suis pas encore la, j'en suis a la découverte du chargement dynamique des DLL. (j'ai déjà réussi a en charger par référence et tout le bazar)
Et donc mon problème est que la bibliothèque est bien chargée avec le LoadLibrary mais que les deux GetProcAddress censés charger les deux fonctions de ma DLL échouent et me renvoi l'erreur 127 (GetLastError): The specified procedure could not be found. (information précise, utile et pertinente n'est-ce pas -_-")
Donc, je me suis mis en quête un peu partout sur le net et sur ce forum en particulier d'information relative a mon problème, j'imagine qu'il y en a, mais bien que j’ai beaucoup cherche je n'ai rien trouve qui colle parfaitement a ma situation alors j'ai décide de créer un post. Je vous donne le code de ma DLL et la partie de mon main ou je charge la dll pour que vous puissiez m'aider au mieux: (je vous épargne les commentaires dont mes fichiers sont truffes étant donne que j'ai construit ces fichiers pour émailler un tutoriel)
1stDLL.h (qui est copie dans le répertoire de mon programme client)
1stDLL.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 #ifndef __HEADER__1ST_DLL__ #define __HEADER__1ST_DLL__ #include <windows.h> #include <tchar.h> namespace GUIMaker { #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) HWND BuildButton( HINSTANCE hInstance, HWND parent, TCHAR* text, int msg, int HPos = 0, int VPos = 0, int bWidth = 100, int bHeight = 30); __declspec(dllexport) HWND BuildWindow( HINSTANCE hInstance, HWND parent, TCHAR* title, DWORD additionalCaract = 0, int HPos = 100, int VPos = 0, int wWidth = 600, int wHeight = 600); #ifdef __cplusplus } #endif } #endif
enfin le bout de code ou j'essaie de charger dynamiquement mes fonctions dans mon fichier Exercise2.cpp (mon fichier MyDLL.dll seul se trouve dans le dossier C:/Windows/sysWOW64/ peut-être que ça a son importance)
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 #include "1stDLL.h" HWND GUIMaker::BuildButton( HINSTANCE hInstance, HWND parent, TCHAR* text, int msg, int HPos, int VPos, int bWidth, int bHeight) { HWND button = CreateWindow( _T("BUTTON"), text, WS_VISIBLE | BS_PUSHBUTTON | WS_CHILD, HPos, VPos, bWidth, bHeight, parent, (HMENU)msg, hInstance, NULL); return button; } HWND GUIMaker::BuildWindow( HINSTANCE hInstance, HWND parent, TCHAR* title, DWORD additionalCaract, int HPos, int VPos, int wWidth, int wHeight) { HWND window; if (additionalCaract != 0) { window = CreateWindow( _T("STATIC"), title, WS_VISIBLE | additionalCaract, HPos, VPos, wWidth, wHeight, parent, NULL, hInstance, NULL); } else window = CreateWindow( _T("MDICLIENT"), title, WS_VISIBLE | WS_OVERLAPPEDWINDOW, HPos, VPos, wWidth, wHeight, parent, NULL, hInstance, NULL); return window; }
PS: j'ai défini WM_YESBUTTON dans mon fichier ressource, idem pour SURPRISE, le problème ne vient pas d'eux puisque ce code marche dans un autre projet ou j'ai utilise les références pour linker ma DLL
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 #include "1stDLL.h" [...] typedef HWND (CALLBACK* DLLFUNC1)(HINSTANCE, HWND, TCHAR*, DWORD, int, int, int, int); // for BuildWindow function typedef HWND (CALLBACK* DLLFUNC2)(HINSTANCE, HWND, TCHAR*, int, int, int, int, int); // for BuildButton function [...] //loading the DLL and its 2 functions DLLFUNC1 DLLFunc1; // Function pointer for BuildWindow function DLLFUNC2 DLLFunc2; // Function pointer for BuildButton function HMODULE hDLL = LoadLibrary( _T("MyDLL.dll") ); if (hDLL != NULL) { DLLFunc1 = (DLLFUNC1) GetProcAddress( hDLL, "GUIMaker::BuildWindow"); DLLFunc2 = (DLLFUNC2) GetProcAddress( hDLL, "GUIMaker::BuildButton"); DWORD problem = GetLastError(); if (!DLLFunc1) { // handle the error FreeLibrary(hDLL); return NULL; } if (!DLLFunc2) { // handle the error FreeLibrary(hDLL); return NULL; } else { HWND Question = DLLFunc1( hInstance, hWnd, SURPRISE, WS_CHILD, 105, 130, 300, 50); HWND YesButton = DLLFunc2( hInstance, hWnd, _T("Yes"), WM_YESBUTTON, 200, 200, 100, 30); FreeLibrary(hDLL); } }
PS2: pour le code de chargement dynamique je me suis servis de la documentation officielle de VC++ 2010 express sur msdn.microsoft.com/chaipuquoi
PS3(comme ça j'ai fait toute la famille ^-^): désolé pour l'indentation ratée par le Ctrl+C Ctrl+V j'ai la flemme de la refaire a la main et désolé pour le manque d'accent dans mon texte, je travaille sur un clavier Mac et je connais pas les raccourcis
Partager