@@ -66,6 +66,12 @@ void CMainDlg::OnCommand()
66
66
case IDM_INJECT:
67
67
OnInject ();
68
68
break ;
69
+ case IDM_IMPORT:
70
+ OnImportSetting ();
71
+ break ;
72
+ case IDM_EXPORT:
73
+ OnExportSetting ();
74
+ break ;
69
75
case IDM_SETPROCESS:
70
76
OnSetProcessId ();
71
77
break ;
@@ -256,3 +262,168 @@ void CMainDlg::OnSetProcessId()
256
262
this ->haveInject = true ;
257
263
258
264
}
265
+
266
+
267
+ void CMainDlg::OnImportSetting ()
268
+ {
269
+ if (!isHaveInject ()) {
270
+ return ;
271
+ }
272
+ // 导入配置文件:忽略列表
273
+ OPENFILENAME ofn; // 使用OPENFILENAMEW结构体,它是OPENFILENAME的Unicode版本
274
+ TCHAR szFile[MAX_PATH]; // 使用WCHAR数组来存储Unicode字符串
275
+ szFile[0 ] = ' \0 ' ;
276
+
277
+ // 初始化OPENFILENAMEW结构体
278
+ ZeroMemory (&ofn, sizeof (ofn));
279
+ ofn.lStructSize = sizeof (ofn);
280
+ ofn.hwndOwner = hDlg;
281
+ ofn.lpstrFile = szFile;
282
+ ofn.nMaxFile = _countof (szFile);
283
+ ofn.lpstrFilter = _T (" HUFS Files\0 *.hufs\0 All Files\0 *.*\0 " );
284
+ ofn.nFilterIndex = 1 ;
285
+ ofn.lpstrFileTitle = NULL ;
286
+ ofn.nMaxFileTitle = 0 ;
287
+ ofn.lpstrInitialDir = NULL ;
288
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
289
+
290
+ // 显示打开文件对话框
291
+ if (GetOpenFileNameW (&ofn) == TRUE && MessageBox (hDlg, _T (" 是否追加配置?" ),_T (" 提示" ), MB_ICONQUESTION | MB_OKCANCEL) == IDOK) {
292
+ // 文件路径为 ofn.lpstrFile
293
+ SettingSerialize (TRUE , ofn.lpstrFile );
294
+ }
295
+ else {
296
+ // 用户取消了操作
297
+ return ;
298
+ }
299
+ }
300
+
301
+
302
+ void CMainDlg::OnExportSetting ()
303
+ {
304
+ // 导出配置文件:忽略列表
305
+ OPENFILENAME ofn; // 使用OPENFILENAMEW结构体,它是OPENFILENAME的Unicode版本
306
+ TCHAR szFile[MAX_PATH]; // 使用WCHAR数组来存储Unicode字符串
307
+ szFile[0 ] = ' \0 ' ;
308
+ TCHAR szFileName[MAX_PATH]; // 存储用户选择的文件名
309
+
310
+ // 初始化OPENFILENAMEW结构体
311
+ ZeroMemory (&ofn, sizeof (ofn));
312
+ ofn.lStructSize = sizeof (ofn);
313
+ ofn.hwndOwner = NULL ;
314
+ ofn.lpstrFile = szFile;
315
+ ofn.nMaxFile = _countof (szFile); // 确保nMaxFile是字符数,而不是字节数
316
+ ofn.lpstrDefExt = L" hufs" ; // 默认扩展名
317
+ ofn.lpstrFilter = L" HUFS Files\0 *.hufs\0 All Files\0 *.*\0 " ;
318
+ ofn.nFilterIndex = 1 ;
319
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_EXPLORER;
320
+
321
+ // 显示保存文件对话框
322
+ if (GetSaveFileNameW (&ofn) == TRUE ) {
323
+ // 用户选择了文件名并点击了“保存”按钮
324
+ // szFile中包含了选择的文件的完整路径
325
+ wcscpy_s (szFileName, ofn.lpstrFile ); // 复制选择的文件名
326
+ // 这里可以进行文件保存操作
327
+ SettingSerialize (FALSE , szFileName);
328
+ }
329
+ else {
330
+ // 用户取消了操作
331
+ return ;
332
+ }
333
+ }
334
+
335
+
336
+ void CMainDlg::SettingSerialize (bool bReadPattern, LPTSTR filename)
337
+ {
338
+ /*
339
+ * 文件格式:
340
+ * 第一行为 版本号
341
+ * 每一行都为 TCHAR[MAX_PATH]
342
+ */
343
+ double version = 1.05 ;
344
+ double versionRead = 0 ;
345
+ DWORD dwCreationDisposition = bReadPattern ? OPEN_EXISTING : CREATE_ALWAYS;
346
+
347
+ // 读写配置文件
348
+ HANDLE hFile = CreateFile (
349
+ filename, // 文件路径
350
+ GENERIC_READ | GENERIC_WRITE, // 打开文件用于读取与写入
351
+ 0 , // 不共享(独占)
352
+ NULL , // 安全属性
353
+ dwCreationDisposition, // 打开已存在的文件
354
+ FILE_ATTRIBUTE_NORMAL,// 正常文件属性
355
+ NULL ); // 不使用模板
356
+
357
+ if (hFile == INVALID_HANDLE_VALUE) {
358
+ MessageBox (hDlg, _T (" 配置文件打开或写入失败!" ), _T (" 严重错误" ), MB_ICONERROR);
359
+ return ;
360
+ }
361
+
362
+ HWND hwndListBox = GetDlgItem (hDlg, IDC_LIST1); // 获取列表框控件的句柄
363
+
364
+ __try {
365
+ if (bReadPattern) {
366
+ // 读模式
367
+ //
368
+ // 读取版本号
369
+ DWORD dwSize = 0 ;
370
+ if (ReadFile (hFile, &versionRead, sizeof (versionRead), &dwSize, NULL )) {
371
+ if (dwSize == sizeof (versionRead)) {
372
+ if (versionRead != version) {
373
+ MessageBox (hDlg, _T (" 配置文件版本号不一致" ), _T (" 提示" ), MB_ICONERROR);
374
+ return ;
375
+ }
376
+ }
377
+ }
378
+ else {
379
+ MessageBox (hDlg, _T (" 读取配置文件失败" ), _T (" 提示" ), MB_ICONERROR);
380
+ return ;
381
+ }
382
+
383
+ // 读取每一行
384
+ TCHAR szBuffer[MAX_PATH];
385
+ DWORD bufferSize = sizeof (szBuffer);
386
+ dwSize = 0 ;
387
+ while (ReadFile (hFile, szBuffer, bufferSize, &dwSize, NULL )) {
388
+ if (dwSize > 0 ) {
389
+ // 添加
390
+ _tcscpy_s (this ->szInput , _countof (this ->szInput ), szBuffer);
391
+ DoAdd ();
392
+ }
393
+ else {
394
+ break ;
395
+ }
396
+ }
397
+
398
+ MessageBox (hDlg, _T (" 导入配置文件完成" ), _T (" 提示" ), MB_ICONINFORMATION);
399
+ }
400
+ else {
401
+ // 写模式
402
+ // 写入版本号
403
+ DWORD bytesWritten = sizeof (version);
404
+ BOOL bSuccess = WriteFile (hFile, &version, bytesWritten, &bytesWritten, NULL );
405
+ if (!bSuccess) {
406
+ MessageBox (hDlg, _T (" 写入版本号失败" ), _T (" 提示" ), MB_ICONERROR);
407
+ return ;
408
+ }
409
+
410
+ // 写入每一行
411
+ int count = ListBox_GetCount (hwndListBox); // 获取列表框中的项数
412
+
413
+ for (int i = 0 ; i < count; ++i) {
414
+ TCHAR buffer[MAX_PATH]; // 每个项的文本不超过255个字符
415
+ ListBox_GetText (hwndListBox, i, buffer); // 获取第i项的文本
416
+
417
+
418
+ bSuccess = WriteFile (hFile, buffer, sizeof (buffer), &bytesWritten, NULL );
419
+ if (!bSuccess) {
420
+ MessageBox (hDlg, _T (" 写入版本号失败" ), _T (" 提示" ), MB_ICONERROR);
421
+ return ;
422
+ }
423
+
424
+ }
425
+ }
426
+ } __finally {
427
+ CloseHandle (hFile);
428
+ }
429
+ }
0 commit comments