2 个版本
0.1.1 | 2023年8月6日 |
---|---|
0.1.0 | 2023年8月5日 |
#26 in #idl
33KB
510 代码行,不含注释
Nucom
Nucom 为 C、C++ 和 Rust 提供了 Windows 平台上常见的组件对象模型 (COM) 架构的跨平台实现。
项目包含 C/C++ 代码,但 Rust 包不需要 C 编译器即可运行。然而,编译 C/C++ 库则需要 Rust 编译器,因为 IDL 编译器 nuidl 是用 Rust 编写的。
示例代码:这里是确保从三种语言(C/C++/Rust)调用用 C/C++/Rust 编写的 COM 类的方法的测试代码。
如何使用
从 C/C++:使用 Nix 包管理器获取库。此仓库的 Nix flake URL 为 "git+https://git.dblsaiko.net/nucom"。最佳支持是使用 CMake 构建系统,它还提供了支持构建 IDL 文件的功能,但 Nix 包也提供了 pkg-config 文件。
从 Rust:将 nucomcore 和 nuidl 包添加到您的项目中。为了启用 IDL 包含路径的自动检测,请添加一个 build.rs 文件,内容如下
fn main() {
nuidl::cargo::use_cargo_deps();
}
为什么?
最初,这开始作为将一个重度使用 COM 接口的 Windows 应用程序移植到 Linux 的努力的一部分。但后来这个项目已经超越了那个目标。
完整的 COM 实现为这些
- C 对象模型提供了一站式服务,这些对象模型与 C++ 类一一对应,并且可以适配到其他各种语言,如 Rust
- 稳定的 C ABI
- 进程间通信 (IPC) 和网络透明性
特别是对于 Rust,这意味着在没有稳定的 Rust ABI 的情况下,它可以作为该语言使用,例如作为插件接口的一部分。这也并不限制插件实现者使用任何特定的语言,理论上任何可以使用 C 类型的东西都可以使用。这也是实现 C++ 与 Rust 互操作性的另一种方法。
(我个人也觉得这真的很酷。)
目标
- 文档 -- :))))
- 支持在 C/C++ 中创建 COM 类 -- 完成
- 支持在 Rust 中创建 COM 类 -- 可以工作,但使用起来还不是很好
- 支持 Win32 的标准 COM 基础接口 -- 部分完成
- Rust、C++ 和 C 的 IDL 编译器 -- 可用于基本的 IDL 文件
- 与为 Win32 COM 编写的库的二进制兼容性 -- 未完成,目前没有在 Windows 上进行任何测试
- 远程过程调用 (RPC) -- 未完成,这是一个巨大的协议
- 打包和 DCOM -- 未完成,需要 RPC
未决定
- Windows 的 COM 服务器和自动激活的概念 -- 这有点邪门,并且还需要某种类型的系统范围注册表
非目标
- 1:1 源代码兼容性,适用于 C/C++ 或 IDL(更确切地说,这是试图改进 Win32 的 API)
相关项目
- Wine 项目,该项目实现了 Windows 上存在的 COM 的全部内容
- intercom,一个跨平台的 COM 的 Rust 包
- windows-rs,Rust 对 Windows API 的绑定
- DCE/RPC,DCOM 中使用的 RPC 协议,用 C 编写的实现
依赖关系
~5–15MB
~176K SLoC