Bonjour à tous.
J'espère ne pas me tromper de catégorie. C'est la première fois que je poste car d'habitude je trouve la solution en cherchant mais dans ce cas j'ai du mal à me documenter. Ça se passe sur Windows (8.1 en l’occurrence) et avec Visual Studio Community 2015.
J'ai des connaissances en C++, mais peu de connaissances sur les DLLs et Windows.
Je programme des plugins (appellés ici X-Tensions) pour un logiciel d'analyse forensic qui s'appelle X-Ways (il s'agit d'un logiciel reconnu dans ce domaine, il permet notamment l'analyse poussée de tout type de support : fichiers effacés, carving, tout type de recherche, etc). Une API est livrée avec la licence. Les X-Tensions sont en fait des DLLs que l'on lance à la demande à partir du logiciel. On a ainsi accès à deux types de fonctions : les fonctions que l'on doit définir, exporter dans le DLL et qui sont lues séquentiellement par le logiciel ; et les fonctions que l'on peut appeler. Je n'ai aucun problème avec l'API et la génération du DLL, tout fonctionne.
Là ou ça se gâte, c'est que j'aimerais créer une fenêtre avec menu etc en faisant appel à Windows API. J'ai suivi le cours suivant http://bob.developpez.com/tutapiwin/ et je comprend bien le principe (et ça marche ) mais dès que je veux implémenter ça dans mon dll je n'y arrive pas.
Je ne souhaite pas forcement que l'on me donne la réponse toute faite, mais si pouviez me donner des éléments de réponse quand à la documentation à utiliser, ou peut-être même que je me trompe de méthode! Comment feriez vous à ma place? J'espère que ces éléments de réponse me permettront d'arriver à implémenter une simple fenetre dans mon plugin (pour commencer).
Je vous montre la structure de mon programme :
Dans le projet XT_Main, X-Tension.cpp contient les pointeurs de fonctions (fonctions du logiciel que l'on peut appeller). X-tension.h contient les déclarations de toutes les fonctions et structures utilisées.
Le projet XT_New est notre fameux plugin.
Ci-dessous New.cpp qui défini le coeur de notre X-Tension avec les fonctions exportées. Ici une seule est vraiment définie, les autres sont vides (elles retournent juste la valeur attendue).
Jusqu'à présent j'ai essayé d'implémenter ceci, en vain (ça fonctionne de manière autonome bien sur) :
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167 #include "X-Tension.h" #include <string> #include <fstream> #include <Windows.h> using namespace std; ///////////////////////////////////////////////////////////////////////////// // XT_Init = fonction lancée en premier après le démarrage de l'X-Tension LONG __stdcall XT_Init(DWORD nVersion, DWORD nFlags, HANDLE hMainWnd, void* lpReserved) { XT_RetrieveFunctionPointers(); // messages d'accueil / XWF_OutputMessage(L"INIT --- INIT --- INIT", 0); XWF_OutputMessage(L"---------> Bienvenue dans ma première X-Tension!!!", 0); return 1; } /////////////////////////////////////////////////////////////////////////////////////////////// // XT_About = fonction lancée quand on clique sur les trois petits points du menu X-Tensions LONG __stdcall XT_About(HANDLE hParentWnd, void* lpReserved) { XWF_OutputMessage(L"---------> About", 0); return 0; } ////////////////////////////////////////////////////////////////////////////// // XT_Prepare LONG __stdcall XT_Prepare(HANDLE hVolume, HANDLE hEvidence, DWORD nOpType, void* lpReserved) { return 0; } ////////////////////////////////////////////////////////////////////////////// // XT_ProcessItem LONG __stdcall XT_ProcessItem(LONG nItemID, void* lpReserved) { XWF_OutputMessage(L"PROCESS ITEM --- PROCESS ITEM --- PROCESS ITEM", 0); return 0; } /////////////////////////////////////////////////////////////////////////////// // XT_ProcessItemEx LONG __stdcall XT_ProcessItemEx(LONG nItemID, HANDLE hItem, void* lpReserved) { XWF_OutputMessage(L"PROCESS ITEM EX --- PROCESS ITEM EX --- PROCESS ITEM EX", 0); // on ajoute un commentaire à cet objet XWF_AddComment(nItemID, L"mon_commentaire_cool", 1); // donne le nom et la taille du fichier traité wstring str; auto num = XWF_GetItemSize(nItemID); str = XWF_GetItemName(nItemID); str += L" "; str += to_wstring(num); str += L" bytes"; XWF_OutputMessage(str.c_str(), 0); return 0; } //////////////////////////////////////////////////////////////////////////////// // XT_PrepareSearch LONG __stdcall XT_PrepareSearch(struct PrepareSearchInfo* PSInfo, struct CodePages* CPages) { XWF_OutputMessage(L"PREPARE SEARCH - PREPARE SEARCH - PREPARE SEARCH", 0); return 1; } /////////////////////////////////////////////////////////////////////////////// // XT_ProcessSearchHit LONG __stdcall XT_ProcessSearchHit(struct SearchHitInfo* info) { return 0; } ////////////////////////////////////////////////////////////////////////////// // XT_Finalize LONG __stdcall XT_Finalize(HANDLE hVolume, HANDLE hEvidence, DWORD nOpType, void* lpReserved) { XWF_OutputMessage(L"FINALIZE --- FINALIZE --- FINALYSE", 0); SearchInfo SInfo; SearchInfo *SIPtr = &SInfo; SIPtr->iSize = sizeof(*SIPtr); SIPtr->hVolume = 0; //SIPtr->lpSearchTerms = L"[a-zA-Z]+:\/\/\0"; // une expression régulière avec GREP, nFlags=65 (GREP + logical search) SIPtr->lpSearchTerms = L"tartes\r\nflambee"; SIPtr->nFlags = 1; SIPtr->nSearchWindow = 0; CodePages CPages; CodePages *CPPtr = &CPages; CPPtr->iSize = sizeof(*CPPtr); CPPtr->nCodePage1 = 1252; CPPtr->nCodePage2 = 1200; CPPtr->nCodePage3 = 65001; CPPtr->nCodePage4 = 0; CPPtr->nCodePage5 = 0; // fonction qui permet une recherche simultanée selon les lpSearchTerms définis XWF_Search(&SInfo, &CPages); // a l'issue de la recherche on alimente un fichier txt sur le bureau de l'utilisateur string const nomFichier{ R"(C:\Users\tux\Desktop\history_search.txt)" }; ofstream monFlux{ nomFichier }; if (monFlux) { int taille; taille = SIPtr->iSize; wstring str; str = SIPtr->lpSearchTerms; XWF_OutputMessage(str.c_str(), 0); XWF_OutputMessage(L"mon fichier est ouvert", 0); monFlux << "Historique de recherche : " << endl; monFlux << taille << endl; } else { XWF_OutputMessage(L"erreur ouverture fichier", 0); } return 0; } /////////////////////////////////////////////////////////////////////////////// // XT_Done LONG __stdcall XT_Done(void* lpReserved) { XWF_OutputMessage(L"DONE --- DONE --- DONE", 0); XWF_OutputMessage(L"------------------------------------------------------------------------------------", 0); return 0; }
En tout cas je vous remercie pour les éléments de réponse que vous pourriez m’apporter!
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 #include <Windows.h> LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX principale; principale.cbSize=sizeof(WNDCLASSEX); principale.style=CS_HREDRAW|CS_VREDRAW; principale.lpfnWndProc=MainProc; principale.cbClsExtra=0; principale.cbWndExtra=0; principale.hInstance=hInstance; principale.hIcon=LoadIcon(NULL,IDI_APPLICATION); principale.hCursor=LoadCursor(NULL,IDC_ARROW); principale.hbrBackground=reinterpret_cast<HBRUSH>(COLOR_WINDOW+1); principale.lpszMenuName=NULL; principale.lpszClassName="std"; principale.hIconSm=LoadIcon(NULL,IDI_APPLICATION); RegisterClassEx(&principale); HWND hWnd; hWnd=CreateWindowEx( WS_EX_CLIENTEDGE, "std", "Notre fenêtre", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); ShowWindow(hWnd,SW_SHOW); MSG msg; while(GetMessage(&msg,NULL,0,0)==TRUE) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK MainProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam) { HDC hDC; PAINTSTRUCT paintst; switch (mes) { case WM_PAINT: hDC=BeginPaint(hWnd,&paintst); EndPaint(hWnd,&paintst); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, mes, wParam, lParam); } }
Julien
Partager