一个基于 C++ 开发的 RTD (Real-Time Data) 服务器,支持为 Microsoft Excel(64位) 和 WPS Office(32位) 提供实时数据服务。该项目实现了 Excel RTD 接口,支持多种数据源和自定义任务。
- Excel RTD 兼容: 实现 Microsoft Excel RTD 接口规范
- 智能权限注册: 自动检测权限级别,支持管理员和用户级COM组件注册
- 自定义任务: 支持时钟、文件读取、网页抓取、命令执行等多种操作
- 异步处理: 支持异步任务执行,提高性能
- COM 组件: 作为 COM 组件可被 Excel 或其他应用程序调用
- 多线程安全: 支持多线程环境下的数据更新
- 实时更新: 自动通知 Excel 数据变化
- 免管理员权限: 支持用户级注册,无需管理员权限即可使用
RTDServer/
├── include/ # 头文件目录
│ ├── IRTDServer.h # RTD 服务器接口定义
│ ├── RTDTopic.h # 主题类定义,管理数据项
│ ├── RtdDll.h # DLL 导出函数声明
│ └── RtdServer.h # RTD 服务器类声明
├── src/ # 源文件目录
│ ├── RTDTopic.cpp # 主题类实现
│ ├── RtdDll.cpp # DLL 入口点和 COM 注册
│ └── RtdServer.cpp # RTD 服务器核心实现
├── dll/ # 预编译DLL文件
│ ├── RTDServer32.dll # 32位版本DLL
│ └── RTDServer64.dll # 64位版本DLL
├── CMakeLists.txt # CMake 构建配置
├── dll.def # DLL 导出函数定义
├── main.cpp # 任务创建和数据处理逻辑
├── Test.cpp # COM 组件测试程序
├── test.xlsx # Excel 测试文件
├── preview.gif # 项目演示动图
└── README.md # 项目说明文档
- 语言: C++20
- 构建工具: CMake 3.10+ / Ninja (可选)
- 平台: Windows (主要)
- 编译器: MSVC (推荐) / GCC (MSYS2 mingw-w64)
- 架构: COM 组件 + DLL
- CMake 3.10 或更高版本
- Ninja 构建系统 (可选,用于更快的增量构建)
- C++23 兼容的编译器 (MSVC 2022+ 或 GCC 11+)
- Windows 开发环境 (推荐)
- Microsoft Excel (用于测试 RTD 功能)
- Windows 7/10/11
- Microsoft Excel 2010 或更高版本
- WPS Office
git clone https://github.com/mwmi/excel-rtd-server.git
cd RTDServermkdir build
cd build
cmake ..
cmake --build . --config Releasemkdir build
cd build
cmake -G Ninja ..
ninja# Debug 构建
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug ..
ninja
# Release 构建
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ..
ninja🎉 新特性: RTDServer 现在支持智能权限检测,会自动选择合适的注册方式!
根据不同位数的 Excel 版本,选择对应的注册命令:
# 进入dll目录
cd dll
# 64位 Excel
regsvr32 RTDServer64.dll
# 32位 Excel 或 WPS
regsvr32 RTDServer32.dll智能注册机制:
- ✅ 有管理员权限: 自动注册到
HKEY_LOCAL_MACHINE,所有用户可用 - ✅ 普通用户权限: 自动注册到
HKEY_CURRENT_USER,当前用户可用 - ✅ 无需手动判断: DLL会自动检测并选择最佳注册方式
如果使用自己编译的DLL,请根据构建架构选择:
# 进入构建目录
cd build
# 64位版本
regsvr32 RTDServer64.dll
# 32位版本
regsvr32 RTDServer32.dll# 方法1: 使用测试程序验证
./test.exe
# 方法2: 直接在Excel中测试
# 输入: =RTD("RTDServer","","clock")在 Excel 单元格中输入以下公式:
=RTD("RTDServer","","clock") # 显示实时时钟
=RTD("RTDServer","","file","C:\path\to\file.txt") # 读取文件内容
=RTD("RTDServer","","web","https://example.com") # 获取网页内容
=RTD("RTDServer","","cmd","dir") # 执行命令
=RTD("RTDServer","","path") # 获取当前路径
显示实时时间,每500毫秒更新一次
=RTD("RTDServer","","clock")
读取指定文件的内容
=RTD("RTDServer","","file","C:\data\info.txt")
获取指定网页的内容
=RTD("RTDServer","","web","https://api.example.com/data")
执行系统命令并返回结果
=RTD("RTDServer","","cmd","ipconfig")
获取当前工作目录
=RTD("RTDServer","","path")
IRtdServer (接口)
↑
RtdServer (实现类)
↓
Topic (数据主题管理)
- RtdServer: 核心服务器类,实现 RTD 接口
- Topic: 数据主题类,管理单个数据项的生命周期
- Task: 任务系统,支持同步/异步数据获取
- COM Factory: COM 组件工厂,负责对象创建
- Excel 调用
ConnectData创建数据主题 - 服务器创建对应的
Topic对象和任务 - 后台线程执行任务,更新数据
- 数据变化时通知 Excel 刷新
- Excel 调用
RefreshData获取最新数据
- 在
main.cpp的createRtdTask函数中添加新的处理逻辑 - 创建相应的任务函数
- 设置任务属性(同步/异步、运行次数等)
示例:
if (firstArg == L"custom") {
topic->setTask([](Topic *topic) -> int {
// 自定义数据获取逻辑
topic->setValue(L"自定义数据");
return 0;
});
return 0;
}- Debug 模式: 包含调试信息,便于开发调试
- Release 模式: 启用 LTO 优化,减小文件体积
- 注册 DLL:
regsvr32 RTDServer.dll - 打开 Excel
- 输入 RTD 公式测试各种功能
- 观察数据实时更新
项目包含独立的COM组件测试程序,无需Excel即可验证DLL功能:
# 构建测试程序
cmake --build . --target test
# 运行测试(需要先注册DLL)
./test.exe项目提供了 test.xlsx 测试文件,包含各种RTD函数示例,可直接打开测试。
CMAKE_BUILD_TYPE: 构建类型 (Debug/Release)CMAKE_CXX_STANDARD: C++ 标准版本 (23)-G Ninja: 使用 Ninja 构建器
- 修改
runing_ms调整更新频率 - 调整
m_HeartbeatInterval设置心跳间隔 - 使用异步任务处理耗时操作
- 使用 Ninja 构建器提升开发效率
- 命令执行功能存在安全风险,请在受控环境中使用
- 网页抓取功能需要网络权限
- 文件读取需要相应的文件系统权限
- WPS启动后不加载 DLL, 导致函数无法正常更新
- 某些杀毒软件可能误报 DLL 文件
- Excel 关闭时可能出现线程清理延迟
- 大文件读取可能影响 Excel 响应性能
🎆 新特性
- ✨ 新增智能权限检测功能
- 🔒 支持用户级COM组件注册,无需管理员权限
- ⚙️ 优化注册表结构,提高注册效率
- 🛡️ 新增
CanWriteToHKLM()权限检测函数 - 📝 更新文档,添加注册状态验证指南
🔧 技术改进
- 重构
DllRegisterServer()和DllUnregisterServer()函数 - 优化错误处理机制
- 简化注册表项配置
🎉 用户体验提升
- 无需手动判断权限级别
- 自动选择最佳注册策略
- 提供更友好的错误反馈
- Fork 项目
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开 Pull Request
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情
- 项目链接: [GitHub Repository]
- 问题反馈: [Issues]
- 文档: [Wiki]
- Microsoft RTD 接口文档
- CMake 社区
- Ninja 构建系统
- C++ 标准委员会
注意: README 为AI生成, 内容仅供参考。
