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