mirror of
https://github.com/LHY0125/PathEditor.git
synced 2026-05-10 10:19:47 +08:00
feat(ui): 统一管理IUP控件名称常量,增强可维护性
refactor(core): 移除未使用的get_app_context函数 refactor(os_env): 修改backup_registry函数以返回错误码并备份到指定目录 refactor(path_manager): 增强路径管理函数的错误处理
This commit is contained in:
+71
-29
@@ -5,6 +5,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <direct.h>
|
||||
#include <shlobj.h>
|
||||
|
||||
// 检查管理员权限
|
||||
int check_admin(void)
|
||||
@@ -45,46 +46,87 @@ int is_path_valid(const char *path)
|
||||
}
|
||||
|
||||
// 备份注册表
|
||||
void backup_registry(void)
|
||||
// 备份到 %APPDATA%/PathEditor/backups/ 目录下
|
||||
ErrorCode backup_registry(void)
|
||||
{
|
||||
// 创建 records 目录
|
||||
if (_mkdir("records") == -1)
|
||||
// 获取 AppData 路径
|
||||
wchar_t appdata_path[MAX_PATH];
|
||||
if (SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, 0, appdata_path) != S_OK)
|
||||
{
|
||||
// 目录可能已存在,忽略错误
|
||||
return ERR_FAILED;
|
||||
}
|
||||
|
||||
// 获取当前时间
|
||||
// 创建备份目录
|
||||
wchar_t backup_dir[MAX_PATH];
|
||||
swprintf(backup_dir, MAX_PATH, L"%s\\PathEditor\\backups", appdata_path);
|
||||
CreateDirectoryW(backup_dir, NULL);
|
||||
|
||||
// 生成时间戳
|
||||
time_t t = time(NULL);
|
||||
struct tm *tm_info = localtime(&t);
|
||||
char time_str[64];
|
||||
strftime(time_str, sizeof(time_str), "%Y%m%d_%H%M%S", tm_info);
|
||||
wchar_t timestamp[64];
|
||||
wcsftime(timestamp, sizeof(timestamp), L"%Y%m%d_%H%M%S", tm_info);
|
||||
|
||||
// 构造备份文件名
|
||||
char filename[256];
|
||||
snprintf(filename, sizeof(filename), "records\\backup_%s.reg", time_str);
|
||||
wchar_t backup_file[MAX_PATH];
|
||||
swprintf(backup_file, MAX_PATH, L"%s\\path_backup_%s.txt", backup_dir, timestamp);
|
||||
|
||||
// 构造 reg export 命令
|
||||
char full_cmd[1024];
|
||||
snprintf(full_cmd, sizeof(full_cmd), "reg.exe export \"HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment\" \"%s\" /y", filename);
|
||||
// 打开文件
|
||||
FILE *fp = _wfopen(backup_file, L"w, ccs=UTF-8");
|
||||
if (!fp)
|
||||
return ERR_FAILED;
|
||||
|
||||
// 使用 CreateProcess 隐藏窗口执行
|
||||
STARTUPINFOA si;
|
||||
PROCESS_INFORMATION pi;
|
||||
memset(&si, 0, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
si.dwFlags = STARTF_USESHOWWINDOW;
|
||||
si.wShowWindow = SW_HIDE; // 隐藏窗口
|
||||
memset(&pi, 0, sizeof(pi));
|
||||
// 备份系统 PATH
|
||||
HKEY hKey;
|
||||
int success = 0;
|
||||
|
||||
if (CreateProcessA(NULL, full_cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
|
||||
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
|
||||
L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment",
|
||||
0, KEY_READ, &hKey) == ERROR_SUCCESS)
|
||||
{
|
||||
// 等待进程结束
|
||||
WaitForSingleObject(pi.hProcess, INFINITE);
|
||||
|
||||
DWORD exit_code = 0;
|
||||
GetExitCodeProcess(pi.hProcess, &exit_code);
|
||||
|
||||
CloseHandle(pi.hProcess);
|
||||
CloseHandle(pi.hThread);
|
||||
DWORD type, size;
|
||||
if (RegQueryValueExW(hKey, L"Path", NULL, &type, NULL, &size) == ERROR_SUCCESS)
|
||||
{
|
||||
wchar_t *buffer = (wchar_t *)malloc(size + 2);
|
||||
if (buffer)
|
||||
{
|
||||
memset(buffer, 0, size + 2);
|
||||
if (RegQueryValueExW(hKey, L"Path", NULL, &type, (LPBYTE)buffer, &size) == ERROR_SUCCESS)
|
||||
{
|
||||
fwprintf(fp, L"# System PATH Backup\n");
|
||||
fwprintf(fp, L"%s\n\n", buffer);
|
||||
success = 1;
|
||||
}
|
||||
free(buffer);
|
||||
}
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
|
||||
// 备份用户 PATH
|
||||
if (RegOpenKeyExW(HKEY_CURRENT_USER,
|
||||
L"Environment",
|
||||
0, KEY_READ, &hKey) == ERROR_SUCCESS)
|
||||
{
|
||||
DWORD type, size;
|
||||
if (RegQueryValueExW(hKey, L"Path", NULL, &type, NULL, &size) == ERROR_SUCCESS)
|
||||
{
|
||||
wchar_t *buffer = (wchar_t *)malloc(size + 2);
|
||||
if (buffer)
|
||||
{
|
||||
memset(buffer, 0, size + 2);
|
||||
if (RegQueryValueExW(hKey, L"Path", NULL, &type, (LPBYTE)buffer, &size) == ERROR_SUCCESS)
|
||||
{
|
||||
fwprintf(fp, L"# User PATH Backup\n");
|
||||
fwprintf(fp, L"%s\n", buffer);
|
||||
success = 1;
|
||||
}
|
||||
free(buffer);
|
||||
}
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
return success ? ERR_OK : ERR_FAILED;
|
||||
}
|
||||
Reference in New Issue
Block a user