@@ -66,6 +66,12 @@ void CMainDlg::OnCommand()
6666 case IDM_INJECT:
6767 OnInject ();
6868 break ;
69+ case IDM_IMPORT:
70+ OnImportSetting ();
71+ break ;
72+ case IDM_EXPORT:
73+ OnExportSetting ();
74+ break ;
6975 case IDM_SETPROCESS:
7076 OnSetProcessId ();
7177 break ;
@@ -256,3 +262,168 @@ void CMainDlg::OnSetProcessId()
256262 this ->haveInject = true ;
257263
258264}
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