# std_com **Repository Path**: ThinkingT/std_com ## Basic Information - **Project Name**: std_com - **Description**: std_com: 跨平台 COM 组件 maces 10.9 ios, android 23 linux gcc 4.2 kernel.2.6.2.4 ohos, windows xp sp2 nodejs unix 支持以上系统 - **Primary Language**: C++ - **License**: MIT - **Default Branch**: dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 5 - **Created**: 2017-12-03 - **Last Updated**: 2026-11-09 ## Categories & Tags **Categories**: utils **Tags**: None ## README # std_com 跨平台 C/C++ 基础框架库,支持 Windows / macOS / Linux / FreeBSD / Android / OHOS。 ## 目录结构 | 目录 | 说明 | |---|---| | `stdcrt/` | C 运行时库(静态库 libstdcrt.a) | | `container/` | 容器库(vector / map / list 等) | | `access/` | 数据库模块(SQLite 封装) | | `asynio/` | 异步 IO 模块(libevent 封装) | | `net/` | 网络模块 | | `msgbus/` | 消息总线 | | `configure/` | 配置管理 | | `host/` | 主机信息采集 | | `kmfev/` | 文件/网络/进程监控(macOS 使用 EndpointSecurity) | | `dispatch/` | Node.js 原生模块(dispatch.node),给 Electron UI 调用 | | `ui/` | Electron UI(前端界面,通过 dispatch.node 调用 native 框架) | | `mainui/` | 原生 UI 可执行程序 | | `main/` | 主可执行程序 | | `stdcom_tool/` | 命令行工具 | ## 整体依赖关系 ``` ┌─────────────────────────────────────────────────────┐ │ stdcrt (静态库) │ │ libstdcrt.a / stdcrt.lib │ └─────────────────┬───────────────────────────────────┘ │ 被链接 ┌─────────────┼─────────────────┐ ▼ ▼ ▼ dispatch.node libcontainer.dylib 其他 dylib... (Node 原生模块) ↑ (access, net, │ │ msgbus, ...) │ │ └───────┬───────┘ ▼ Electron UI (ui/) 前端 JS 调用 dispatch.node dispatch.node 再调 C++ 框架 ``` **关键点:dispatch.node 只链接 libstdcrt.a(静态),不直接链接其他 dylib。** 它通过 dlopen() 动态加载 libcontainer / libmsgbus 等。 --- ## 编译顺序 必须按以下顺序编译: ``` 1. cmake . && make ← 先编出所有 dylib + libstdcrt.a 2. cd dispatch && ./build.sh ← 编 dispatch.node(依赖 libstdcrt.a) 3. cd ui && npm start ← 启动 Electron UI(依赖 dispatch.node + 所有 dylib) ``` --- ## 一、C/C++ 框架编译 ### 环境要求 | 平台 | 编译器 | 额外依赖 | |---|---|---| | macOS | AppleClang (Xcode 12+) | EndpointSecurity 头文件(macOS 11+ 自带) | | Linux | GCC / Clang | - | | Windows | MSVC (Visual Studio 2019+) | - | ### macOS / Linux / FreeBSD ```bash # 1. 生成 Makefile(在项目根目录执行) cmake . # 2. 编译全部(所有 dylib + 可执行文件) make -j$(sysctl -n hw.ncpu) # 3. 只编译某个模块 make kmfev # 监控模块 make mainui # UI 程序 make main # 主程序 make stdcom_tool # 命令行工具 ``` ### Windows (Visual Studio) ```cmd # 1. 生成 VS 工程 cmake -G "Visual Studio 16 2019" . # 2. 打开 .sln 编译,或命令行 cmake --build . --config Release ``` ### 清理重新编译 ```bash rm -rf CMakeCache.txt CMakeFiles cmake_install.cmake Makefile cmake . && make -j$(sysctl -n hw.ncpu) ``` ### 编译产物(libs/ 目录) ``` libs/ ├── libstdcrt.a # 静态库(基础运行时)★ dispatch.node 依赖这个 ├── libcontainer.dylib # 容器 ├── libaccess.dylib # 数据库 ├── libasynio.dylib # 异步 IO ├── libnet.dylib # 网络 ├── libmsgbus.dylib # 消息总线 ├── libconfigure.dylib # 配置 ├── libhost.dylib # 主机信息 ├── libkmfev.dylib # 监控(macOS 含 EndpointSecurity) ├── main # 主程序 ├── mainui # UI 程序 └── stdcom_tool # 命令行工具 ``` --- ## 二、dispatch.node 编译 dispatch 是 Node.js 原生模块(N-API),Electron UI 通过它调用 C++ 框架。 ### 依赖链 ``` dispatch.node ├── 静态链接: libs/libstdcrt.a ← 必须先 cmake + make ├── Node.js (>= 16) ← 运行时 ├── node-gyp (>= 9) ← 构建工具 └── node-addon-api ← N-API C++ 头文件(npm 自动装) ``` ### macOS 编译 ```bash # 前提: cmake . && make 已经完成,libs/libstdcrt.a 存在 cd dispatch # 一行搞定(自动 npm install + node-gyp build) ./build.sh # 或手动 npm install --save-dev node-gyp@9 node-addon-api ./node_modules/.bin/node-gyp configure build ``` ### Linux 编译 ```bash # 前提: cmake . && make 已经完成,libs/libstdcrt.a 存在 # Debian / Ubuntu 需要先装 sudo apt-get install -y build-essential python3 cd dispatch ./build.sh ``` ### Windows 编译 ```cmd # 前提: cmake --build . 已经完成,libs/stdcrt.lib 存在 # 前提: 安装 Visual Studio 2019+(带 C++ 桌面开发工作负载) cd dispatch build.bat ``` ### 清理重编 ```bash # macOS / Linux cd dispatch && ./build.sh clean # Windows cd dispatch && build.bat clean ``` ### 编译产物 ``` dispatch/build/Release/dispatch.node ← 原始产物 ui/resources/dispatch.node ← 复制到 UI 目录(Electron 从这里加载) ``` **编译完记得复制到 UI 目录:** ```bash cp dispatch/build/Release/dispatch.node ui/resources/dispatch.node # 同时确保 ui/resources/ 下有所有 dylib cp libs/*.dylib ui/resources/ # macOS # 或 cp libs/*.so ui/resources/ # Linux # 或 copy libs\*.dll ui\resources\ # Windows ``` ### 验证 dispatch.node ```bash cd dispatch node -e "var d = require('./build/Release/dispatch'); console.log(typeof d.create, typeof d.start, typeof d.stop)" # 预期输出: function function function ``` --- ## 三、Electron UI 编译与测试 ### 环境要求 | 依赖 | 版本 | 说明 | |---|---|---| | Node.js | >= 16 | 推荐 18 / 20 LTS | | npm | >= 8 | 随 Node 一起装 | | Electron | 33.4.11 | 由 ui/package.json 锁定 | | 已编译好的 C++ 框架 | - | libs/*.dylib + dispatch.node | ### 启动 UI(开发模式) ```bash # 1. 确保前置产物都在 ls libs/libstdcrt.a dispatch/build/Release/dispatch.node ls ui/resources/dispatch.node ui/resources/*.dylib # 2. 装 Electron 依赖 cd ui npm install # 3. 开发模式启动 npm start ``` ### 打包发布 ```bash cd ui # macOS .dmg npm run dist:mac # Windows .exe 安装包(在 Windows 上跑) npm run dist:win # Linux AppImage(在 Linux 上跑) npm run dist:linux ``` 打包产物在 `ui/dist/` 目录。 ### UI 测试检查清单 | 检查项 | 怎么看 | |---|---| | dispatch.node 能加载 | 启动不报错,主界面正常显示 | | C++ dylib 能加载 | 菜单操作不崩,日志无 dlopen 错误 | | 文件监控 | 创建/删除文件时,监控面板有事件 | | 网络监控 | 应用发起网络请求时,监控面板有事件 | | 进程监控 | 启动新进程时,监控面板有事件 | | 消息总线 | 模块间通信正常,无 timeout | | 数据库 | 配置保存/读取正常 | --- ## 运行(原生程序,非 UI) ### 主程序 ```bash cd libs ./main ``` ### UI 程序(原生版,非 Electron) ```bash cd libs ./mainui ``` ### 命令行工具 ```bash cd libs ./stdcom_tool ``` ### macOS EndpointSecurity 监控 `libkmfev.dylib` 使用 macOS EndpointSecurity 框架监控文件/网络/进程事件。 **运行要求:** - macOS 11.5+ - **root 权限**(ESF 客户端必须以 root 运行) - **完全磁盘访问权限**(系统设置 → 隐私与安全 → 完全磁盘访问权限,添加你的进程) ```bash sudo ./main # 或 sudo ./mainui ``` 如果以普通用户运行,`EsfMonitor_Start()` 返回 0,监控功能静默禁用,不影响其他功能。 --- ## 完整编译流程(一键) ```bash # 假设在 macOS 上 # 1. C++ 框架 cmake . && make -j$(sysctl -n hw.ncpu) # 2. dispatch.node cd dispatch && ./build.sh && cd .. # 3. 复制产物到 UI cp dispatch/build/Release/dispatch.node ui/resources/ cp libs/*.dylib ui/resources/ # 4. 启动 UI cd ui && npm install && npm start ``` --- ## 模块详解 ### kmfev — 文件/网络/进程监控 macOS 使用 EndpointSecurity 框架实现,纯 C 接口: ```c #include "esf_monitor.h" EsfMonitor* mon = EsfMonitor_Create(); EsfMonitor_SetCallback(mon, MyCallback, userdata); int ok = EsfMonitor_Start(mon); // 返回 1=成功, 0=失败 // ... 事件回调 ... EsfMonitor_Stop(mon); EsfMonitor_Destroy(mon); ``` 监控事件: | 事件 | 枚举 | 说明 | |---|---|---| | 进程执行 | ESF_EVENT_PROCESS_EXEC | exec() 调用,带完整命令行 | | 进程退出 | ESF_EVENT_PROCESS_EXIT | 进程终止 | | 进程 fork | ESF_EVENT_PROCESS_FORK | 创建子进程 | | 文件创建 | ESF_EVENT_FILE_CREATE | create() / mkdir() | | 文件打开 | ESF_EVENT_FILE_OPEN | open() | | 文件删除 | ESF_EVENT_FILE_UNLINK | unlink() / rmdir() | | UIPC 绑定 | ESF_EVENT_NETWORK_BIND | Unix domain socket bind | | UIPC 连接 | ESF_EVENT_NETWORK_CONNECT | Unix domain socket connect | Linux / Windows 下 `esf_monitor.h` 提供 stub 实现,所有函数可用但功能禁用。 ### dispatch.node — Node.js 原生模块 N-API 稳定 ABI,C++ 类封装在 JS 中直接调用: ```javascript const dispatch = require('./dispatch.node'); // 创建容器 const container = dispatch.create({ path: '/some/path', code: 'config_xxx' }); // 启动 container.start(); // 发消息给 native const result = container.sendMessage(JSON.stringify({ type: 'query', data: 'hello' })); // 停止 container.stop(); ``` --- ## CMake 选项 | 选项 | 默认值 | 说明 | |---|---|---| | `ENABLE_STDCOM` | ON | 编译 stdcom 框架所有子模块 | | `ENABLE_FSANITIZE` | OFF | 启用 AddressSanitizer 调试 | ```bash cmake -DENABLE_FSANITIZE=ON . cmake -DENABLE_STDCOM=OFF . ``` ## 常见问题 | 错误 | 原因 | 解决 | |---|---|---| | `dispatch.node: library not found for -lstdcrt` | `libs/libstdcrt.a` 不存在 | 先跑 `cmake . && make` | | `gyp ERR! configure error` + undici 栈 | node-gyp 版本太新 | `npm i -D node-gyp@9` | | Windows `MSB8020: Build tools v143 not found` | 没装 VS Build Tools | 装 VS 2019+ 的 C++ 桌面开发 | | Linux `fatal error: dlcom/cominc.h` | 目录结构不对 | 确认 `dispatch/` 父目录有 `include/` | | Electron 启动后 `dlopen` 报错 | `ui/resources/` 缺 dylib | 把 `libs/*.dylib` 拷进去 | | macOS `libkmfev.dylib` 链接失败 | SDK 缺 EndpointSecurity | Xcode 12+ 自带,或用 `-lEndpointSecurity` |