mirror of
https://github.com/LHY0125/PathEditor.git
synced 2026-07-01 03:25:54 +08:00
Compare commits
27 Commits
v3.0
...
06aee13f55
| Author | SHA1 | Date | |
|---|---|---|---|
| 06aee13f55 | |||
| 9d0797eafa | |||
| f69787a110 | |||
| a8f1bfeaab | |||
| 9a78b88c4a | |||
| 3af0e96060 | |||
| 6ba7e702f2 | |||
| 9aa1e208ba | |||
| d934d21323 | |||
| 8767271e96 | |||
| 55ff64b92d | |||
| 55d0f80743 | |||
| ce232cb024 | |||
| bd1b05be55 | |||
| a769a6b9b3 | |||
| 6509ef98e4 | |||
| c928c271e8 | |||
| 02e702b285 | |||
| af3138c146 | |||
| 6e6adf3b85 | |||
| e84b33c5ca | |||
| ac6b409f3a | |||
| 1bbe95582a | |||
| 3ecf35963d | |||
| 276d2c5fe3 | |||
| a9339f9b9f | |||
| 7fac2aab35 |
@@ -1,6 +1,7 @@
|
|||||||
/.trae/
|
/.trae/
|
||||||
/.vscode/
|
/.vscode/
|
||||||
/build/
|
/build/
|
||||||
|
/build*/
|
||||||
|
|
||||||
*.o
|
*.o
|
||||||
*.obj
|
*.obj
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
# CLAUDE.md
|
||||||
|
|
||||||
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||||
|
|
||||||
|
## 项目概述
|
||||||
|
|
||||||
|
Path Editor 是一个 Windows 系统环境变量(PATH)管理工具,使用 C 语言和 IUP 图形库开发。支持系统变量和用户变量的双视图编辑、智能路径检测、自动备份、JSON 导入导出等功能。
|
||||||
|
|
||||||
|
## 构建与运行
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 配置(需要 MinGW-w64 和 CMake 在 PATH 中)
|
||||||
|
cmake -B build -G "MinGW Makefiles"
|
||||||
|
|
||||||
|
# 编译
|
||||||
|
cmake --build build
|
||||||
|
|
||||||
|
# 打包
|
||||||
|
build_installer.bat
|
||||||
|
|
||||||
|
# 以管理员身份运行
|
||||||
|
powershell -Command "Start-Process 'build\\PathEditor.exe' -Verb RunAs"
|
||||||
|
```
|
||||||
|
|
||||||
|
编译器为 MinGW-w64 GCC,C17 标准。IUP 3.31 和 Lua 5.5 库已包含在 `libs/` 目录下。CMake 在 POST_BUILD 阶段自动复制运行时 DLL 到输出目录。
|
||||||
|
|
||||||
|
## 架构
|
||||||
|
|
||||||
|
项目采用 **MVC 分层架构**:
|
||||||
|
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
├── main.c # 入口:初始化日志/Lua/UI,创建 AppContext
|
||||||
|
├── core/ # Model — 业务逻辑,零 IUP 依赖
|
||||||
|
│ ├── registry_service.c # Windows 注册表读写
|
||||||
|
│ ├── path_manager.c # 路径增删移查与清理
|
||||||
|
│ ├── app_context.c # 应用运行时状态(StringList sys/user)
|
||||||
|
│ ├── import_export.c # JSON/TXT 导入导出
|
||||||
|
│ └── lua_config.c # Lua 配置热加载
|
||||||
|
├── ui/ # View — IUP 界面构建
|
||||||
|
│ ├── main_window.c # 主窗口布局(Tab、列表、按钮、状态栏)
|
||||||
|
│ ├── dialogs.c # 自定义输入对话框
|
||||||
|
│ └── ui_utils.c # 斑马纹刷新等界面工具
|
||||||
|
├── controller/ # Controller — 连接 UI 与 Model
|
||||||
|
│ └── callbacks.c # 所有按钮/搜索/拖拽/键盘回调
|
||||||
|
└── utils/ # 纯工具层,无业务依赖
|
||||||
|
├── string_ext.c # StringList 动态字符串数组
|
||||||
|
├── os_env.c # 编码转换 + 管理员权限检测
|
||||||
|
├── safe_string.c # 安全字符串操作
|
||||||
|
├── logger.c # 日志系统
|
||||||
|
└── error_code.h # 统一 ErrorCode 枚举
|
||||||
|
```
|
||||||
|
|
||||||
|
**数据流**: `registry_service` 从注册表加载 → `AppContext` 持有 StringList → UI 展示 → 用户操作经 `callbacks` 调用 `path_manager` 修改 StringList → `registry_service` 写回注册表 → `WM_SETTINGCHANGE` 广播。
|
||||||
|
|
||||||
|
**UI 控件寻址**:控件通过 `IupSetHandle("NAME", handle)` 注册名称,通过 `IupGetHandle("NAME")` 或 `IupGetDialogChild(dlg, "NAME")` 查找,不使用全局变量。AppContext 通过 `IupSetAttribute(dlg, "APP_CONTEXT", ctx)` 挂载到对话框上。
|
||||||
|
|
||||||
|
**Lua 配置**:`lua/config.lua` 定义所有 UI 文本和布局参数(按钮文字、颜色、尺寸等),通过 `lua_config_get_string("section", "key")` 读取,修改后无需重新编译。
|
||||||
|
|
||||||
|
## 关键约束
|
||||||
|
|
||||||
|
- IUP UTF8MODE 必须在 `IupOpen()` 之前通过 `putenv("IUP_UTF8MODE=YES")` 设置
|
||||||
|
- `IupFlatList` 数据操作必须在 `IupShowXY`(控件 Map)之后才能生效
|
||||||
|
- 管理员权限检测通过尝试以 KEY_WRITE 打开注册表键实现
|
||||||
|
- 非管理员模式下所有修改按钮和保存按钮被禁用
|
||||||
|
- PATH 注册表值使用 `REG_EXPAND_SZ` 类型,支持 `%SystemRoot%` 等变量展开
|
||||||
|
- 拖拽支持在管理员模式下需要调用 `ChangeWindowMessageFilter` 绕过 UIPI
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.10)
|
||||||
|
project(PathEditor VERSION 3.0 LANGUAGES C)
|
||||||
|
|
||||||
|
# 启用资源编译器以处理 .rc 文件
|
||||||
|
enable_language(RC)
|
||||||
|
|
||||||
|
# 设置 C 标准
|
||||||
|
set(CMAKE_C_STANDARD 17)
|
||||||
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||||
|
set(CMAKE_C_EXTENSIONS OFF) # 禁用特定编译器的扩展(如 gnu17),强制使用标准 C17
|
||||||
|
|
||||||
|
# 定义源文件
|
||||||
|
set(SOURCES
|
||||||
|
src/main.c
|
||||||
|
src/utils/string_ext.c
|
||||||
|
src/utils/os_env.c
|
||||||
|
src/utils/safe_string.c
|
||||||
|
src/utils/logger.c
|
||||||
|
src/ui/ui_utils.c
|
||||||
|
src/ui/dialogs.c
|
||||||
|
src/ui/main_window.c
|
||||||
|
src/core/registry_service.c
|
||||||
|
src/core/path_manager.c
|
||||||
|
src/core/app_context.c
|
||||||
|
src/core/lua_config.c
|
||||||
|
src/core/import_export.c
|
||||||
|
src/controller/callbacks.c
|
||||||
|
ico/resources.rc
|
||||||
|
)
|
||||||
|
|
||||||
|
# 创建 GUI 可执行文件(WIN32 属性会自动添加 -mwindows 参数)
|
||||||
|
add_executable(${PROJECT_NAME} WIN32 ${SOURCES})
|
||||||
|
|
||||||
|
# 添加宏定义
|
||||||
|
target_compile_definitions(${PROJECT_NAME} PRIVATE
|
||||||
|
_WIN32
|
||||||
|
UNICODE
|
||||||
|
_UNICODE
|
||||||
|
)
|
||||||
|
|
||||||
|
# 添加编译选项
|
||||||
|
if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
|
||||||
|
target_compile_options(${PROJECT_NAME} PRIVATE
|
||||||
|
-Wall
|
||||||
|
-O2
|
||||||
|
-fexec-charset=UTF-8
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# 设置头文件搜索路径
|
||||||
|
target_include_directories(${PROJECT_NAME} PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/include
|
||||||
|
${CMAKE_SOURCE_DIR}/include/core
|
||||||
|
${CMAKE_SOURCE_DIR}/include/ui
|
||||||
|
${CMAKE_SOURCE_DIR}/include/controller
|
||||||
|
${CMAKE_SOURCE_DIR}/include/utils
|
||||||
|
${CMAKE_SOURCE_DIR}/libs/IUP/include
|
||||||
|
${CMAKE_SOURCE_DIR}/libs/lua/include
|
||||||
|
)
|
||||||
|
|
||||||
|
# 设置库文件搜索路径
|
||||||
|
target_link_directories(${PROJECT_NAME} PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/libs/IUP
|
||||||
|
${CMAKE_SOURCE_DIR}/libs/lua
|
||||||
|
)
|
||||||
|
|
||||||
|
# 链接所需库
|
||||||
|
target_link_libraries(${PROJECT_NAME} PRIVATE
|
||||||
|
lua55
|
||||||
|
iup
|
||||||
|
iupcd
|
||||||
|
gdi32
|
||||||
|
comdlg32
|
||||||
|
comctl32
|
||||||
|
uuid
|
||||||
|
ole32
|
||||||
|
advapi32
|
||||||
|
)
|
||||||
|
|
||||||
|
# 编译完成后,复制程序实际需要的核心 DLL 文件到构建输出目录
|
||||||
|
set(IUP_REQUIRED_DLLS "${CMAKE_CURRENT_SOURCE_DIR}/libs/IUP/iup.dll")
|
||||||
|
set(LUA_REQUIRED_DLLS "${CMAKE_CURRENT_SOURCE_DIR}/libs/lua/lua55.dll")
|
||||||
|
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
${IUP_REQUIRED_DLLS}
|
||||||
|
"$<TARGET_FILE_DIR:${PROJECT_NAME}>"
|
||||||
|
COMMENT "Copying required DLLs to build directory..."
|
||||||
|
)
|
||||||
|
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
${LUA_REQUIRED_DLLS}
|
||||||
|
"$<TARGET_FILE_DIR:${PROJECT_NAME}>"
|
||||||
|
COMMENT "Copying Lua DLL to build directory..."
|
||||||
|
)
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
CC = gcc
|
|
||||||
WINDRES = windres
|
|
||||||
|
|
||||||
# Paths - specific to user environment
|
|
||||||
IUP_DIR = libs/iup-3.31_Win64_dllw6_lib
|
|
||||||
INCLUDE_DIR = $(IUP_DIR)/include
|
|
||||||
LIB_DIR = $(IUP_DIR)
|
|
||||||
LOCAL_INCLUDE_DIR = include
|
|
||||||
|
|
||||||
# Output Directories
|
|
||||||
OBJ_DIR = obj
|
|
||||||
BIN_DIR = bin
|
|
||||||
|
|
||||||
# Flags
|
|
||||||
# -mwindows: Create GUI app (no console)
|
|
||||||
# -DUNICODE -D_UNICODE: Use Wide Character API
|
|
||||||
CFLAGS = -Wall -O2 -I$(INCLUDE_DIR) -I$(LOCAL_INCLUDE_DIR) -D_WIN32 -DUNICODE -D_UNICODE -fexec-charset=UTF-8
|
|
||||||
LDFLAGS = -L$(LIB_DIR) -liup -liupcd -lgdi32 -lcomdlg32 -lcomctl32 -luuid -lole32 -ladvapi32 -mwindows
|
|
||||||
|
|
||||||
# Source
|
|
||||||
SRC = src/main.c src/utils.c src/registry.c src/callbacks.c src/ui.c
|
|
||||||
RES = ico/resources.rc
|
|
||||||
OBJ = $(OBJ_DIR)/main.o $(OBJ_DIR)/utils.o $(OBJ_DIR)/registry.o $(OBJ_DIR)/callbacks.o $(OBJ_DIR)/ui.o $(OBJ_DIR)/resources.o
|
|
||||||
EXE = $(BIN_DIR)/PathEditor.exe
|
|
||||||
|
|
||||||
all: $(BIN_DIR) $(OBJ_DIR) $(EXE)
|
|
||||||
|
|
||||||
$(BIN_DIR):
|
|
||||||
if not exist $(BIN_DIR) mkdir $(BIN_DIR)
|
|
||||||
|
|
||||||
$(OBJ_DIR):
|
|
||||||
if not exist $(OBJ_DIR) mkdir $(OBJ_DIR)
|
|
||||||
|
|
||||||
$(EXE): $(OBJ)
|
|
||||||
$(CC) -o $@ $^ $(LDFLAGS)
|
|
||||||
|
|
||||||
$(OBJ_DIR)/main.o: src/main.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
$(OBJ_DIR)/utils.o: src/utils.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
$(OBJ_DIR)/registry.o: src/registry.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
$(OBJ_DIR)/callbacks.o: src/callbacks.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
$(OBJ_DIR)/ui.o: src/ui.c
|
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
$(OBJ_DIR)/resources.o: ico/resources.rc
|
|
||||||
$(WINDRES) -i $< -o $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
if exist $(OBJ_DIR)\*.o del /Q $(OBJ_DIR)\*.o
|
|
||||||
if exist $(BIN_DIR)\*.exe del /Q $(BIN_DIR)\*.exe
|
|
||||||
@@ -24,6 +24,11 @@
|
|||||||
* **实时搜索**:顶部搜索框支持不区分大小写的实时过滤查找。
|
* **实时搜索**:顶部搜索框支持不区分大小写的实时过滤查找。
|
||||||
* **快捷键**:支持 Delete 键快速删除选中项。
|
* **快捷键**:支持 Delete 键快速删除选中项。
|
||||||
|
|
||||||
|
* **🔄 导入导出**:
|
||||||
|
* **导出备份**:将 PATH 导出为 JSON 文件,方便备份和迁移。
|
||||||
|
* **导入恢复**:从 JSON 文件导入路径配置。
|
||||||
|
* **格式兼容**:支持旧版 TXT 格式导入。
|
||||||
|
|
||||||
* **便捷管理**:
|
* **便捷管理**:
|
||||||
* ➕ **新建**:添加新路径到列表。
|
* ➕ **新建**:添加新路径到列表。
|
||||||
* 📂 **浏览**:直接从文件资源管理器选择目录添加。
|
* 📂 **浏览**:直接从文件资源管理器选择目录添加。
|
||||||
@@ -33,6 +38,22 @@
|
|||||||
|
|
||||||
* **轻量级**:原生 C 语言编写,无臃肿依赖,运行速度极快。
|
* **轻量级**:原生 C 语言编写,无臃肿依赖,运行速度极快。
|
||||||
|
|
||||||
|
## 🛠️ 架构与二次开发
|
||||||
|
|
||||||
|
本项目注重代码的模块化和可维护性,采用了经典的 **MVC 分层架构**,非常适合作为 C 语言桌面程序开发的参考:
|
||||||
|
|
||||||
|
* **分层设计**:
|
||||||
|
* `src/core/` (Model): 核心数据与业务逻辑,完全脱离 UI 框架(无任何 `<iup.h>` 依赖)。
|
||||||
|
* `src/ui/` (View): 负责界面布局与组件的纯视觉展示。
|
||||||
|
* `src/controller/` (Controller): 负责连接用户交互与底层数据。
|
||||||
|
* `src/utils/` (Utils): 纯粹的底层工具类封装(系统级调用、字符串处理)。
|
||||||
|
* **热配置系统**:所有 UI 参数(窗口大小、按钮文本、布局间距等)均通过 `lua/config.lua` 配置,修改无需重新编译即可生效。
|
||||||
|
* **清晰的应用状态**:摒弃了脆弱的全局变量模式,采用 `AppContext` 统一管理应用运行时的上下文状态,通过指针传递,安全可靠。
|
||||||
|
* **开发工具库**:
|
||||||
|
* 统一错误码系统 (`utils/error_code.h`)
|
||||||
|
* 安全字符串函数 (`utils/safe_string.h`)
|
||||||
|
* 日志系统 (`utils/logger.h`)
|
||||||
|
|
||||||
## 📦 下载与安装
|
## 📦 下载与安装
|
||||||
|
|
||||||
您可以从 [Releases](https://github.com/LHY0125/PathEditor/releases) 页面下载最新的安装包 (`PathEditorSetup.exe`)。
|
您可以从 [Releases](https://github.com/LHY0125/PathEditor/releases) 页面下载最新的安装包 (`PathEditorSetup.exe`)。
|
||||||
@@ -47,11 +68,13 @@
|
|||||||
|
|
||||||
* Windows 操作系统
|
* Windows 操作系统
|
||||||
* GCC 编译器 (推荐 MinGW-w64)
|
* GCC 编译器 (推荐 MinGW-w64)
|
||||||
* Make 工具
|
* CMake 工具 (推荐使用 CMake 构建)
|
||||||
* IUP 库 (已包含在 `libs` 目录下)
|
* IUP 库 (已包含在 `libs` 目录下)
|
||||||
* Inno Setup 6 (仅打包需要)
|
* Inno Setup 6 (仅打包需要)
|
||||||
|
|
||||||
### 编译步骤
|
### 编译步骤 (推荐使用 CMake)
|
||||||
|
|
||||||
|
本项目已迁移至 CMake 构建系统,支持生成更标准的构建文件并集成到各大 IDE。
|
||||||
|
|
||||||
1. 克隆仓库:
|
1. 克隆仓库:
|
||||||
|
|
||||||
@@ -60,14 +83,18 @@
|
|||||||
cd PathEditor
|
cd PathEditor
|
||||||
```
|
```
|
||||||
|
|
||||||
2. 编译项目:
|
2. 使用 CMake 配置和编译:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mingw32-make
|
# 生成构建系统 (以 MinGW 为例)
|
||||||
|
cmake -B build -G "MinGW Makefiles"
|
||||||
|
|
||||||
|
# 编译项目
|
||||||
|
cmake --build build
|
||||||
```
|
```
|
||||||
|
|
||||||
3. 运行:
|
3. 运行:
|
||||||
编译成功后,可执行文件位于 `bin/PathEditor.exe`。
|
编译成功后,可执行文件位于 `build/PathEditor.exe`。
|
||||||
|
|
||||||
### 打包 (可选)
|
### 打包 (可选)
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -1,7 +1,4 @@
|
|||||||
@echo off
|
@echo off
|
||||||
echo Copying DLLs...
|
|
||||||
if not exist bin mkdir bin
|
|
||||||
copy /Y "libs\iup-3.31_Win64_dllw6_lib\*.dll" bin\
|
|
||||||
|
|
||||||
echo Building Installer...
|
echo Building Installer...
|
||||||
"D:\Program Files (x86)\Inno Setup 6\ISCC.exe" "dist\installer.iss"
|
"D:\Program Files (x86)\Inno Setup 6\ISCC.exe" "dist\installer.iss"
|
||||||
|
|||||||
Vendored
+2
-2
@@ -37,8 +37,8 @@ Name: "english"; MessagesFile: "compiler:Default.isl"
|
|||||||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
||||||
|
|
||||||
[Files]
|
[Files]
|
||||||
Source: "d:\Code\doing_exercises\programs\PathEditor\bin\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
|
Source: "d:\Code\doing_exercises\programs\PathEditor\build\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
|
||||||
Source: "d:\Code\doing_exercises\programs\PathEditor\bin\*.dll"; DestDir: "{app}"; Flags: ignoreversion
|
Source: "d:\Code\doing_exercises\programs\PathEditor\build\*.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||||
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
|
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
|
||||||
|
|
||||||
[Icons]
|
[Icons]
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ int btn_del_cb(Ihandle *self);
|
|||||||
int btn_up_cb(Ihandle *self);
|
int btn_up_cb(Ihandle *self);
|
||||||
int btn_down_cb(Ihandle *self);
|
int btn_down_cb(Ihandle *self);
|
||||||
int btn_clean_cb(Ihandle *self);
|
int btn_clean_cb(Ihandle *self);
|
||||||
|
int btn_import_cb(Ihandle *self);
|
||||||
|
int btn_export_cb(Ihandle *self);
|
||||||
int btn_ok_cb(Ihandle *self);
|
int btn_ok_cb(Ihandle *self);
|
||||||
int btn_cancel_cb(Ihandle *self);
|
int btn_cancel_cb(Ihandle *self);
|
||||||
int btn_help_cb(Ihandle *self);
|
int btn_help_cb(Ihandle *self);
|
||||||
@@ -27,4 +29,7 @@ int list_dropfiles_cb(Ihandle *self, const char *filename, int num, int x, int y
|
|||||||
// 键盘按键回调
|
// 键盘按键回调
|
||||||
int list_k_any_cb(Ihandle *self, int c);
|
int list_k_any_cb(Ihandle *self, int c);
|
||||||
|
|
||||||
|
// 载入数据与更新UI
|
||||||
|
void load_all_paths(void);
|
||||||
|
|
||||||
#endif // CALLBACKS_H
|
#endif // CALLBACKS_H
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#ifndef APP_CONTEXT_H
|
||||||
|
#define APP_CONTEXT_H
|
||||||
|
|
||||||
|
#include "utils/string_ext.h"
|
||||||
|
#include <iup.h>
|
||||||
|
|
||||||
|
// 应用上下文结构体,用于存储应用运行时的状态
|
||||||
|
typedef struct {
|
||||||
|
StringList sys_paths;
|
||||||
|
StringList user_paths;
|
||||||
|
} AppContext;
|
||||||
|
|
||||||
|
// 创建应用上下文
|
||||||
|
AppContext* create_app_context(void);
|
||||||
|
|
||||||
|
// 销毁应用上下文
|
||||||
|
void destroy_app_context(AppContext* ctx);
|
||||||
|
|
||||||
|
// 获取应用上下文
|
||||||
|
AppContext* get_app_context(Ihandle *ih);
|
||||||
|
|
||||||
|
#endif // APP_CONTEXT_H
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#ifndef IMPORT_EXPORT_H
|
||||||
|
#define IMPORT_EXPORT_H
|
||||||
|
|
||||||
|
#include "utils/string_ext.h"
|
||||||
|
#include "utils/error_code.h"
|
||||||
|
|
||||||
|
#define EXPORT_VERSION "1.0"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
StringList system;
|
||||||
|
StringList user;
|
||||||
|
} ExportData;
|
||||||
|
|
||||||
|
// 导出 PATH 到文件
|
||||||
|
ErrorCode export_paths_to_file(const ExportData *data, const char *filepath);
|
||||||
|
|
||||||
|
// 从文件导入 PATH
|
||||||
|
ErrorCode import_paths_from_file(const char *filepath, ExportData *data);
|
||||||
|
|
||||||
|
#endif // IMPORT_EXPORT_H
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
#ifndef LUA_CONFIG_H
|
||||||
|
#define LUA_CONFIG_H
|
||||||
|
|
||||||
|
#include <lua.h>
|
||||||
|
|
||||||
|
// 初始化 Lua 配置系统
|
||||||
|
// 返回值: 0 成功, -1 失败
|
||||||
|
int lua_config_init(void);
|
||||||
|
|
||||||
|
// 销毁 Lua 配置系统
|
||||||
|
void lua_config_destroy(void);
|
||||||
|
|
||||||
|
// 获取字符串配置值
|
||||||
|
// section: 配置章节名 (如 "app", "dialog", "button")
|
||||||
|
// key: 配置键名 (如 "name", "size", "rastersize")
|
||||||
|
// 返回值: 配置值字符串, 失败时返回 NULL
|
||||||
|
const char* lua_config_get_string(const char* section, const char* key);
|
||||||
|
|
||||||
|
// 获取整型配置值
|
||||||
|
// section: 配置章节名
|
||||||
|
// key: 配置键名
|
||||||
|
// default_value: 默认值 (当配置不存在或转换失败时返回)
|
||||||
|
// 返回值: 配置值或默认值
|
||||||
|
int lua_config_get_int(const char* section, const char* key, int default_value);
|
||||||
|
|
||||||
|
// 重新加载配置文件
|
||||||
|
// 返回值: 0 成功, -1 失败
|
||||||
|
int lua_config_reload(void);
|
||||||
|
|
||||||
|
// 获取配置加载状态
|
||||||
|
// 返回值: 1 已加载, 0 未加载
|
||||||
|
int lua_config_is_loaded(void);
|
||||||
|
|
||||||
|
#endif // LUA_CONFIG_H
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef PATH_MANAGER_H
|
||||||
|
#define PATH_MANAGER_H
|
||||||
|
|
||||||
|
#include "utils/string_ext.h"
|
||||||
|
#include "utils/error_code.h"
|
||||||
|
|
||||||
|
// 移除列表中指定索引的项
|
||||||
|
ErrorCode path_manager_remove_at(StringList *list, int index);
|
||||||
|
|
||||||
|
// 上移指定索引的项
|
||||||
|
ErrorCode path_manager_move_up(StringList *list, int index);
|
||||||
|
|
||||||
|
// 下移指定索引的项
|
||||||
|
ErrorCode path_manager_move_down(StringList *list, int index);
|
||||||
|
|
||||||
|
// 清理无效和重复的路径
|
||||||
|
ErrorCode path_manager_clean(StringList *list);
|
||||||
|
|
||||||
|
#endif // PATH_MANAGER_H
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef REGISTRY_SERVICE_H
|
||||||
|
#define REGISTRY_SERVICE_H
|
||||||
|
|
||||||
|
#include "utils/string_ext.h"
|
||||||
|
#include "utils/error_code.h"
|
||||||
|
|
||||||
|
// 加载系统变量和用户变量到字符串列表
|
||||||
|
ErrorCode load_system_paths(StringList *list);
|
||||||
|
ErrorCode load_user_paths(StringList *list);
|
||||||
|
|
||||||
|
// 从字符串列表保存系统变量和用户变量
|
||||||
|
ErrorCode save_system_paths(const StringList *list);
|
||||||
|
ErrorCode save_user_paths(const StringList *list);
|
||||||
|
|
||||||
|
#endif // REGISTRY_SERVICE_H
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
#ifndef GLOBALS_H
|
|
||||||
#define GLOBALS_H
|
|
||||||
|
|
||||||
#include <iup.h>
|
|
||||||
|
|
||||||
// 注册表路径常量
|
|
||||||
#define REG_PATH_SYS L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"
|
|
||||||
#define REG_PATH_USER L"Environment"
|
|
||||||
#define REG_VALUE L"Path"
|
|
||||||
|
|
||||||
// 全局控件句柄声明
|
|
||||||
extern Ihandle *dlg; // 主对话框句柄
|
|
||||||
extern Ihandle *tabs_main; // 标签页容器
|
|
||||||
extern Ihandle *list_sys; // 系统变量列表
|
|
||||||
extern Ihandle *list_user; // 用户变量列表
|
|
||||||
extern Ihandle *lbl_status; // 状态标签句柄
|
|
||||||
extern Ihandle *btn_new; // 新增按钮句柄
|
|
||||||
extern Ihandle *btn_edit; // 编辑按钮句柄
|
|
||||||
extern Ihandle *btn_browse; // 浏览按钮句柄
|
|
||||||
extern Ihandle *btn_del; // 删除按钮句柄
|
|
||||||
extern Ihandle *btn_up; // 上移按钮句柄
|
|
||||||
extern Ihandle *btn_down; // 下移按钮句柄
|
|
||||||
extern Ihandle *btn_clean; // 一键清理按钮句柄
|
|
||||||
extern Ihandle *btn_ok; // 确认按钮句柄
|
|
||||||
extern Ihandle *btn_cancel; // 取消按钮句柄
|
|
||||||
extern Ihandle *btn_help; // 帮助按钮句柄
|
|
||||||
extern Ihandle *txt_search; // 搜索框
|
|
||||||
|
|
||||||
// 简单字符串列表结构,用于搜索缓存
|
|
||||||
typedef struct {
|
|
||||||
char **items;
|
|
||||||
int count;
|
|
||||||
int capacity;
|
|
||||||
} StringList;
|
|
||||||
|
|
||||||
extern StringList raw_sys_paths;
|
|
||||||
extern StringList raw_user_paths;
|
|
||||||
|
|
||||||
// 缓存操作函数声明
|
|
||||||
void init_string_list(StringList *list);
|
|
||||||
void add_string_list(StringList *list, const char *str);
|
|
||||||
void clear_string_list(StringList *list);
|
|
||||||
|
|
||||||
#endif // GLOBALS_H
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#ifndef REGISTRY_H
|
|
||||||
#define REGISTRY_H
|
|
||||||
|
|
||||||
// 从注册表加载所有PATH到列表控件
|
|
||||||
void load_all_paths();
|
|
||||||
|
|
||||||
// 将列表控件中的PATH保存回注册表
|
|
||||||
void save_all_paths();
|
|
||||||
|
|
||||||
#endif // REGISTRY_H
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#ifndef UI_H
|
|
||||||
#define UI_H
|
|
||||||
|
|
||||||
#include <iup.h>
|
|
||||||
|
|
||||||
// 创建列表控件
|
|
||||||
Ihandle *create_path_list();
|
|
||||||
|
|
||||||
// 创建右侧功能按钮区域
|
|
||||||
Ihandle *create_main_buttons();
|
|
||||||
|
|
||||||
// 创建底部按钮区域
|
|
||||||
Ihandle *create_bottom_buttons();
|
|
||||||
|
|
||||||
#endif // UI_H
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef DIALOGS_H
|
||||||
|
#define DIALOGS_H
|
||||||
|
|
||||||
|
// 自定义输入对话框
|
||||||
|
// 返回值:0-取消,1-确认
|
||||||
|
int custom_input_dialog(const char *title, const char *label_text, char *buffer, int buffer_size);
|
||||||
|
|
||||||
|
#endif // DIALOGS_H
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#ifndef MAIN_WINDOW_H
|
||||||
|
#define MAIN_WINDOW_H
|
||||||
|
|
||||||
|
#include <iup.h>
|
||||||
|
|
||||||
|
// 创建主窗口
|
||||||
|
Ihandle* create_main_window(void);
|
||||||
|
|
||||||
|
#endif // MAIN_WINDOW_H
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#ifndef UI_UTILS_H
|
||||||
|
#define UI_UTILS_H
|
||||||
|
|
||||||
|
#include <iup.h>
|
||||||
|
#include "utils/string_ext.h"
|
||||||
|
|
||||||
|
// 刷新单个列表框样式
|
||||||
|
void refresh_single_list_style(Ihandle *list);
|
||||||
|
|
||||||
|
// 同步字符串列表到 UI 列表框
|
||||||
|
void sync_string_list_to_ui(Ihandle *list_ui, const StringList *str_list);
|
||||||
|
|
||||||
|
#endif // UI_UTILS_H
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#ifndef UTILS_H
|
|
||||||
#define UTILS_H
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include <wchar.h>
|
|
||||||
#include <iup.h>
|
|
||||||
|
|
||||||
// 宽字符转UTF-8
|
|
||||||
char* wide_to_utf8(const wchar_t* wstr);
|
|
||||||
|
|
||||||
// UTF-8转宽字符
|
|
||||||
wchar_t* utf8_to_wide(const char* str);
|
|
||||||
|
|
||||||
// 检查管理员权限
|
|
||||||
int check_admin();
|
|
||||||
|
|
||||||
// 检查路径是否有效(存在且为目录)
|
|
||||||
int is_path_valid(const char *path);
|
|
||||||
|
|
||||||
// 刷新列表样式(斑马纹)
|
|
||||||
void refresh_list_style();
|
|
||||||
void refresh_single_list_style(Ihandle *list);
|
|
||||||
|
|
||||||
// 备份注册表
|
|
||||||
void backup_registry();
|
|
||||||
|
|
||||||
// 不区分大小写的字符串查找
|
|
||||||
char *stristr(const char *haystack, const char *needle);
|
|
||||||
|
|
||||||
#endif // UTILS_H
|
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef ERROR_CODE_H
|
||||||
|
#define ERROR_CODE_H
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
ERR_OK = 0, // 成功
|
||||||
|
ERR_FAILED = -1, // 失败
|
||||||
|
ERR_NULL_PTR = -2, // 空指针
|
||||||
|
ERR_OUT_OF_MEMORY = -3, // 内存不足
|
||||||
|
ERR_FILE_NOT_FOUND = -4, // 文件不存在
|
||||||
|
ERR_PERMISSION_DENIED = -5, // 权限拒绝
|
||||||
|
ERR_INVALID_FORMAT = -6, // 无效格式
|
||||||
|
ERR_REGISTRY_FAILED = -7, // 注册表操作失败
|
||||||
|
ERR_NOT_FOUND = -8, // 未找到
|
||||||
|
ERR_EXISTS = -9 // 已存在
|
||||||
|
} ErrorCode;
|
||||||
|
|
||||||
|
const char* error_code_to_string(ErrorCode code);
|
||||||
|
|
||||||
|
#endif // ERROR_CODE_H
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
#ifndef LOGGER_H
|
||||||
|
#define LOGGER_H
|
||||||
|
|
||||||
|
// 日志级别
|
||||||
|
typedef enum {
|
||||||
|
LOG_LEVEL_DEBUG, // 调试日志级别
|
||||||
|
LOG_LEVEL_INFO, // 信息日志级别
|
||||||
|
LOG_LEVEL_WARN, // 警告日志级别
|
||||||
|
LOG_LEVEL_ERROR // 错误日志级别
|
||||||
|
} LogLevel;
|
||||||
|
|
||||||
|
// 初始化日志系统
|
||||||
|
void log_init(const char *log_file, LogLevel level);
|
||||||
|
|
||||||
|
// 销毁日志系统
|
||||||
|
void log_destroy(void);
|
||||||
|
|
||||||
|
// 日志函数
|
||||||
|
void log_debug(const char *fmt, ...);
|
||||||
|
|
||||||
|
// 信息日志函数
|
||||||
|
void log_info(const char *fmt, ...);
|
||||||
|
|
||||||
|
// 警告日志函数
|
||||||
|
void log_warn(const char *fmt, ...);
|
||||||
|
|
||||||
|
// 错误日志函数
|
||||||
|
void log_error(const char *fmt, ...);
|
||||||
|
|
||||||
|
// 设置日志级别
|
||||||
|
void log_set_level(LogLevel level);
|
||||||
|
|
||||||
|
#endif // LOGGER_H
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#ifndef OS_ENV_H
|
||||||
|
#define OS_ENV_H
|
||||||
|
|
||||||
|
// 检查是否以管理员权限运行
|
||||||
|
int check_admin(void);
|
||||||
|
|
||||||
|
// 检查路径是否有效
|
||||||
|
int is_path_valid(const char *path);
|
||||||
|
|
||||||
|
// 备份注册表
|
||||||
|
void backup_registry(void);
|
||||||
|
|
||||||
|
#endif // OS_ENV_H
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef SAFE_STRING_H
|
||||||
|
#define SAFE_STRING_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
// 安全字符串操作函数
|
||||||
|
char* safe_strcpy(char *dst, size_t dst_size, const char *src);
|
||||||
|
|
||||||
|
// 安全字符串拼接函数
|
||||||
|
char* safe_strcat(char *dst, size_t dst_size, const char *src);
|
||||||
|
|
||||||
|
// 安全字符串复制函数
|
||||||
|
char* safe_strdup(const char *src);
|
||||||
|
|
||||||
|
#endif // SAFE_STRING_H
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
#ifndef STRING_EXT_H
|
||||||
|
#define STRING_EXT_H
|
||||||
|
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
// 简单字符串列表结构
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char **items;
|
||||||
|
int count;
|
||||||
|
int capacity;
|
||||||
|
} StringList;
|
||||||
|
|
||||||
|
// 字符串列表
|
||||||
|
void init_string_list(StringList *list);
|
||||||
|
void add_string_list(StringList *list, const char *str);
|
||||||
|
void clear_string_list(StringList *list);
|
||||||
|
|
||||||
|
// 字符串转换函数
|
||||||
|
char *wide_to_utf8(const wchar_t *wstr);
|
||||||
|
wchar_t *utf8_to_wide(const char *str);
|
||||||
|
char *stristr(const char *haystack, const char *needle);
|
||||||
|
|
||||||
|
#endif // STRING_EXT_H
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user