聊一聊被 .NET程序员 遗忘的 COM 组件( 二 )

从输出中可以看到已成功注册,并且生成了一个 FlyCom.tlb 代理文件,接下来可以到注册表中验证一下 GUID=270C3ED3-053D-4324-9176-9C3FA2BE58A7 注册项以及别名为 FlyCom.Show 的注册项 。

聊一聊被 .NET程序员 遗忘的 COM 组件

文章插图
聊一聊被 .NET程序员 遗忘的 COM 组件

文章插图
4. 使用 C++ 调用要想 C++ 调用 C# 写的 COM 组件,就像 RPC 调用一样,直接自动生成的代理文件即可,将 FlyCom.tlb 复制到 根目录,并且将程序改成 Win32 位,截图如下:
聊一聊被 .NET程序员 遗忘的 COM 组件

文章插图
接下来就是完整的 C++ 代码 。
#include <Windows.h>#include <string.h>#include <iostream>#import "FlyCom.tlb" named_guids raw_interface_onlyusing namespace std;int main(){ CoInitialize(NULL); FlyCom::BaseFlyPtr ptr; ptr.CreateInstance("FlyCom.Show"); wchar_t* c = ptr->Show(L"hello world"); wprintf(L"%s", c); getchar();}将程序跑起来后,真的很完美 。
聊一聊被 .NET程序员 遗忘的 COM 组件

文章插图
从 C++ 调用 COM 的流程图可以很清楚的看到,这是面向接口编程的方式,非常完美 。
三:COM 多语言互通原理1. 架构图千言万语不及一张图 。
聊一聊被 .NET程序员 遗忘的 COM 组件

文章插图
这就是 COM 能够实现多语言互通的规范 , 熟悉 C++ 的朋友肯定知道 vtable ,C++ 能够实现多态,全靠这玩意 , COM 也是用了 vtable 这套模式,所以诸如 JAVA,C#,VBS 必须在二进制层面将代码组织成上图这种形式,才能实现 COM 的互通 。
所以在 C# 中你看到的 DispId 特性就是为了按照 vtable 方式进行组织,对于 ole32 和 combase 这些 COM 运行环境的基石,我们后续用 windbg 来解读一下 , 这一篇就先到这里,希望对你有帮助 。

推荐阅读