#com #nucom #object #model #cross-platform #component #idl

nucomcore

Nucom,跨平台组件对象模型实现

2 个版本

0.1.1 2023年8月6日
0.1.0 2023年8月5日

#26 in #idl

MIT 许可证

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