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

文章插图

文章插图
4. 使用 C++ 调用要想 C++ 调用 C# 写的 COM 组件,就像 RPC 调用一样,直接自动生成的代理文件即可,将
FlyCom.tlb
复制到 根目录,并且将程序改成 Win32
位,截图如下:
文章插图
接下来就是完整的 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();}
将程序跑起来后,真的很完美 。
文章插图
从 C++ 调用 COM 的流程图可以很清楚的看到,这是面向接口编程的方式,非常完美 。
三:COM 多语言互通原理1. 架构图千言万语不及一张图 。

文章插图
这就是 COM 能够实现多语言互通的规范 , 熟悉 C++ 的朋友肯定知道
vtable
,C++ 能够实现多态,全靠这玩意 , COM 也是用了 vtable 这套模式,所以诸如 JAVA,C#,VBS 必须在二进制层面将代码组织成上图这种形式,才能实现 COM 的互通 。所以在 C# 中你看到的 DispId 特性就是为了按照 vtable 方式进行组织,对于 ole32 和 combase 这些 COM 运行环境的基石,我们后续用 windbg 来解读一下 , 这一篇就先到这里,希望对你有帮助 。
推荐阅读
- 细聊.Net Core中IServiceScope的工作方式
- 我的世界马怎么驯服怎么判断马被完全驯服(我的世界如何驯服马教程)
- 聊天怎麽聊(万能聊天框架100例)
- dns如何强制解除安全模式(dns被强制改了怎么办)
- 广西山水情画 广西山水情画聊天室
- 旃檀燃烬怎样读(唐僧为什么被封为旃檀功德佛)
- 最贵的口红品牌排行 第一被誉为口红界的女王
- 微信怎么强行删除好友(微信怎么删除好友不要被发现)
- 线上服务宕机,码农试用期被毕业,原因竟是给MySQL加个字段
- 聊聊Linux中CPU上下文切换