聊一聊被 .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 來解讀一下 , 這一篇就先到這里,希望對你有幫助 。

推薦閱讀