精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊一聊被 .NET程序員 遺忘的 COM 組件

開發 開發工具
COM 能夠實現多語言互通的規范,熟悉 C++ 的朋友肯定知道 vtable ,C++ 能夠實現多態,全靠這玩意,COM 也是用了 vtable 這套模式,所以諸如 JAVA,C#,VBS 必須在二進制層面將代碼組織成上圖這種形式,才能實現 COM 的互通。

一、背景

1.講故事

最近遇到了好幾起和 COM 相關的Dump,由于對 COM 整體運作不是很了解,所以分析此類dump還是比較頭疼的,比如下面這個經典的 COM 調用棧。

0:044> ~~[138c]s
win32u!NtUserMessageCall+0x14:
00007ffc`5c891184 c3 ret
0:061> k
# Child-SP RetAddr Call Site
00 0000008c`00ffec68 00007ffc`5f21bfbe win32u!NtUserMessageCall+0x14
01 0000008c`00ffec70 00007ffc`5f21be38 user32!SendMessageWorker+0x11e
02 0000008c`00ffed10 00007ffc`124fd4af user32!SendMessageW+0xf8
03 0000008c`00ffed70 00007ffc`125e943b xxx!DllUnregisterServer+0x3029f
04 0000008c`00ffeda0 00007ffc`125e9685 xxx!DllUnregisterServer+0x11c22b
05 0000008c`00ffede0 00007ffc`600b50e7 xxx!DllUnregisterServer+0x11c475
06 0000008c`00ffee20 00007ffc`60093ccd ntdll!LdrpCallInitRoutine+0x6f
07 0000008c`00ffee90 00007ffc`60092eef ntdll!LdrpProcessDetachNode+0xf5
08 0000008c`00ffef60 00007ffc`600ae319 ntdll!LdrpUnloadNode+0x3f
09 0000008c`00ffefb0 00007ffc`600ae293 ntdll!LdrpDecrementModuleLoadCountEx+0x71
0a 0000008c`00ffefe0 00007ffc`5cd7c00e ntdll!LdrUnloadDll+0x93
0b 0000008c`00fff010 00007ffc`5d47cf78 KERNELBASE!FreeLibrary+0x1e
0c 0000008c`00fff040 00007ffc`5d447aa3 combase!CClassCache::CDllPathEntry::CFinishObject::Finish+0x28 [onecore\com\combase\objact\dllcache.cxx @ 3420]
0d 0000008c`00fff070 00007ffc`5d4471a9 combase!CClassCache::CFinishComposite::Finish+0x4b [onecore\com\combase\objact\dllcache.cxx @ 3530]
0e 0000008c`00fff0a0 00007ffc`5d3f1499 combase!CClassCache::FreeUnused+0xdd [onecore\com\combase\objact\dllcache.cxx @ 6547]
0f 0000008c`00fff650 00007ffc`5d3f13c7 combase!CoFreeUnusedLibrariesEx+0x89 [onecore\com\combase\objact\dllapi.cxx @ 117]
10 (Inline Function) --------`-------- combase!CoFreeUnusedLibraries+0xa [onecore\com\combase\objact\dllapi.cxx @ 74]
11 0000008c`00fff690 00007ffc`6008a019 combase!CDllHost::MTADllUnloadCallback+0x17 [onecore\com\combase\objact\dllhost.cxx @ 929]
12 0000008c`00fff6c0 00007ffc`6008bec4 ntdll!TppTimerpExecuteCallback+0xa9
13 0000008c`00fff710 00007ffc`5f167e94 ntdll!TppWorkerThread+0x644
14 0000008c`00fffa00 00007ffc`600d7ad1 kernel32!BaseThreadInitThunk+0x14
15 0000008c`00fffa30 00000000`00000000 ntdll!RtlUserThreadStart+0x21

為了做一個簡單的梳理,我們搭建一個簡單的多語言 COM 互操作。

二、COM 多語言互操作

1. 背景

可能很多新生代的程序員都不知道 COM ,最多也只聽過這個名詞,其實在 Windows 上有海量的 COM 組件,這些組件信息都是注冊在 HKEY_CLASSES_ROOT\CLSID 節點目錄,截圖如下:

圖片

這個和微服務中的 注冊中心 是一個道理,這一篇我們用 C# 寫一個COM組件,用 C++ 去調用。

2. C# 寫一個 COM 組件

寫一個 .NET Framework 4.8 下的 32bit  FlyCom 組件,一個接口,一個實現類,具體原理后續再分析,先搭建嘗嘗鮮, C# 代碼如下:

namespace FlyCom
{
[Guid("31A3CED7-B4F1-4D59-881A-EA1D7ABCC4CF")]
public interface BaseFly
{
[DispId(1)]
string Show(string str);
}

[Guid("270C3ED3-053D-4324-9176-9C3FA2BE58A7")]
[ProgId("FlyCom.Show")]
public class Fly : BaseFly
{
public string Show(string str)
{
return $"str={str}, length={str.Length}";
}
}
}

這里簡單說一下:

Guid

一個是接口(BaseFly) 的唯一碼,即 IID 信息, 一個是 COM組件的 唯一碼,叫做 CLSID。

ProgId

因為 GUID 不方便記憶,所以給這個 COM組件 取一個別名叫 FlyCom.Show 。

DispId

這個是為了遵循 COM多語言互通下的 vtable調用標準,表示第一個接口方法是 Show,后續再聊。

有了代碼,接下來還要做三個配置。

  • 對 COM 的可見性

修改 AssemblyInfo.cs 中的 ComVisible = true,參考如下:

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(true)]

  • 生成簽名

一般來說,將 com 放到 注冊表,最好都生成一個強簽名,否則會有警告提示。

圖片

  • 注冊 com 互操作

在屬性面板中,選擇 Build 選項卡,選中 Register for COM interop 選項即可。

圖片

3. 注冊 COM 到注冊表

要將 com組件 放到注冊表,需要使用注冊表編輯工具 regasm。

Microsoft Windows [版本 10.0.19042.746]
(c) 2020 Microsoft Corporation. 保留所有權利。

C:\Users\Administrator>cd /d C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64>C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe D:\net6\ConsoleApp1\FlyCom\bin\Debug\FlyCom.dll /tlb:FlyCom.tlb /CodeBase
Microsoft .NET Framework 程序集注冊實用工具版本 4.8.4084.0
(適用于 Microsoft .NET Framework 版本 4.8.4084.0)
版權所有 (C) Microsoft Corporation。保留所有權利。

成功注冊了類型
成功注冊了導出到“D:\net6\ConsoleApp1\FlyCom\bin\Debug\FlyCom.tlb”的程序集和類型庫

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64>

從輸出中可以看到已成功注冊,并且生成了一個 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_only

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

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2020-12-09 16:55:57

程序員技術

2016-10-11 11:38:06

程序員

2021-07-16 11:48:26

模型 .NET微軟

2021-01-01 09:01:05

前端組件化設計

2020-06-05 07:50:04

技術思維程序員擺地攤

2020-09-08 06:54:29

Java Gradle語言

2023-07-06 13:56:14

微軟Skype

2023-12-14 11:35:32

.NET泄露模式

2018-06-07 13:17:12

契約測試單元測試API測試

2021-01-28 22:31:33

分組密碼算法

2023-09-22 17:36:37

2020-05-22 08:16:07

PONGPONXG-PON

2023-09-20 23:01:03

Twitter算法

2021-12-06 09:43:01

鏈表節點函數

2021-03-01 18:37:15

MySQL存儲數據

2023-09-27 16:39:38

2021-08-01 09:55:57

Netty時間輪中間件

2024-10-28 21:02:36

消息框應用程序

2020-08-12 08:34:16

開發安全We

2022-10-08 11:33:56

邊緣計算云計算
點贊
收藏

51CTO技術棧公眾號

精品人妻无码一区二区| 奇米影视四色在线| 欧美亚洲日本| 日本欧美一区二区三区乱码| 一本色道久久88综合日韩精品| 青青草av网站| 黄色在线观看视频网站| 久久综合久久综合九色| 成人国产精品一区| 毛片在线视频播放| 精品少妇人欧美激情在线观看| 久久人人爽人人爽人人片av免费| 亚洲情侣在线| 亚洲欧美日韩第一区| 天堂av2020| 欧美美女日韩| 亚洲一区二区在线免费看| 久久亚洲高清| 亚洲AV无码国产精品午夜字幕| 男女精品视频| 欧美激情国产日韩精品一区18| 自拍偷拍亚洲天堂| 精品av导航| 69精品人人人人| 美女福利视频在线| 牛牛精品在线| 日韩美女视频19| 日韩欧美视频第二区| 成人免费观看在线视频| 青青草原综合久久大伊人精品优势| 久久久久久成人精品| 开心激情五月网| 天堂在线精品| 亚洲国产成人精品电影| theporn国产精品| 久久人人视频| 日本道免费精品一区二区三区| 精品久久久无码人妻字幂| 午夜精品一区| 欧美国产精品中文字幕| 久久久久久久久一区| 成人午夜视频一区二区播放| 亚洲电影有码| 一区二区日韩免费看| 欧美高清视频在线播放| 国产suv精品一区二区68| 欧洲美女日日| 亚洲性xxxx| 欧美18—19性高清hd4k| 蜜桃精品wwwmitaows| 日韩精品免费在线观看| 性欧美成人播放77777| 欧美黑人做爰爽爽爽| 精品国产乱码久久久久久老虎| 三年中文在线观看免费大全中国| 久久精品xxxxx| 欧美日韩aaaaa| 潘金莲激情呻吟欲求不满视频| 国产综合色在线观看| 欧美亚洲综合网| 日韩av在线中文| 99视频有精品高清视频| 欧美精品国产精品| 老司机av网站| 久久动漫网址| 亚洲欧美中文在线视频| 国产91丝袜美女在线播放| 欧美综合一区| 在线国产精品播放| 人妻夜夜添夜夜无码av | 在线电影一区| 久久久之久亚州精品露出| 国产精品第九页| 亚洲在线一区| 国产精品日日做人人爱| 国产口爆吞精一区二区| 国产精品亚洲人在线观看| 国产精品18毛片一区二区| 污视频网站免费观看| 久久精品一区二区三区av| 水蜜桃亚洲精品| 大地资源网3页在线观看| 一区二区日韩电影| 精品久久久无码人妻字幂| 美女的胸无遮挡在线观看| 色香蕉久久蜜桃| 日韩不卡的av| 亚洲国产国产| 久久激情视频久久| 91蜜桃视频在线观看| 日韩精品福利网| 亚洲精品欧美一区二区三区| 天堂国产一区二区三区| 国产拍揄自揄精品视频麻豆| 久久免费视频2| 欧美伦理91| 欧美精品久久天天躁| 亚洲欧美在线不卡| 五月激情综合| 欧美一级淫片videoshd| 国产乱码精品一区二三区蜜臂| 成人av在线网| 正在播放精油久久| 乱人伦视频在线| 91精品国产综合久久久久久久| 精品1卡二卡三卡四卡老狼| 精品大片一区二区| 久久人人爽人人爽人人片av高清| 亚洲国产无线乱码在线观看| 成人免费电影视频| 椎名由奈jux491在线播放 | 婷婷国产v国产偷v亚洲高清| 午夜国产一区二区三区| 国产日韩三级| 久久影院中文字幕| 国产99久久久久久免费看| zzijzzij亚洲日本少妇熟睡| 中文字幕一区二区三区四区五区六区| 超碰成人av| 日韩亚洲欧美中文三级| 国产视频不卡在线| 免费在线日韩av| 爱情岛论坛亚洲入口| 色网站免费在线观看| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 三年中国中文观看免费播放| 日韩天堂av| av观看久久| av黄在线观看| 91精品黄色片免费大全| 99在线视频免费| 久久精品观看| 免费在线观看一区二区| bbw在线视频| 精品国产一二三区| www.av视频在线观看| 国产酒店精品激情| 综合国产精品久久久| 电影一区电影二区| 亚洲天堂av在线免费观看| 日韩欧美性视频| 不卡的av在线播放| 国产精品久久..4399| 加勒比久久高清| 97久久精品人搡人人玩| 亚洲免费一级片| 亚洲一区二区三区在线播放| 三日本三级少妇三级99| 91精品国产乱码久久久久久| 国产一区二区在线免费| 免费av网站在线看| 91精品国产色综合久久不卡蜜臀 | 成人免费观看a| 巨大荫蒂视频欧美大片| 欧美精品亚洲一区二区在线播放| 成年人视频软件| 久久www免费人成看片高清| 伊人久久99| 精品国产一区二区三区2021| 欧美成人精品三级在线观看| 精品区在线观看| 亚洲成av人影院| 人人妻人人澡人人爽人人精品 | 日本人69视频| 亚洲中无吗在线| 999在线观看免费大全电视剧| av毛片在线播放| 亚洲精品videossex少妇| 91视频免费网址| 国产亚洲综合av| 日本久久久久久久久久久久| 国产精品99久久久久久动医院| 亚洲综合国产精品| 97人澡人人添人人爽欧美| 日韩精品视频在线观看网址| 日本免费精品视频| 国产精品久久久久aaaa| 原创真实夫妻啪啪av| 亚洲日本黄色| 色就是色欧美| 欧美一级片网址| 欧美性受xxxx白人性爽| av电影在线观看| 日韩欧美视频一区| 中文字幕视频网站| 亚洲女子a中天字幕| 国产精品无码在线| 麻豆精品一区二区三区| 国产精彩视频一区二区| 欧美日韩伦理| 国产v亚洲v天堂无码| 日韩国产网站| 欧美巨乳在线观看| 国家队第一季免费高清在线观看| 91精品国产全国免费观看| 亚洲精品男人的天堂| 亚洲视频在线一区观看| 亚洲精品理论片| 国产一区免费电影| 蜜臀久久99精品久久久酒店新书| 亚洲草久电影| 玛丽玛丽电影原版免费观看1977 | 成人午夜视频在线观看| 一区二区三区入口| 亚洲毛片一区| 日韩中文在线字幕| 国产一区二区三区站长工具| 成人羞羞视频免费| 欧美日韩卡一| 欧洲s码亚洲m码精品一区| bestiality新另类大全| 亚洲一级片在线看| 欧美熟女一区二区| 91精品国产综合久久久蜜臀图片| 无码人妻丰满熟妇奶水区码| 亚洲国产一区二区在线播放| 黄色激情小视频| 久久久久久免费毛片精品| 亚洲国产综合av| 美女久久久精品| 成人免费无码av| 99在线观看免费视频精品观看| 国产又粗又爽又黄的视频| 欧美少妇性xxxx| 看高清中日韩色视频| jizz国产精品| 91影院未满十八岁禁止入内| 国产一区高清| 国产精品99久久99久久久二8| www成人免费观看| 欧美激情视频在线免费观看 欧美视频免费一 | 夜夜躁狠狠躁日日躁av| 在线免费av一区| 4438国产精品一区二区| 激情久久av一区av二区av三区| 久久久国产精品黄毛片| 亚洲欧美日韩一区二区 | 日韩欧美午夜| 天堂资源在线亚洲视频| 九九热线有精品视频99| 久久综合入口| 免费av一区| 欧洲一区二区在线观看| 久久99国产精品视频| 欧美精品一区二区三区久久| 欧美wwwsss9999| 久久香蕉综合色| 国产中文精品久高清在线不| 人偷久久久久久久偷女厕| 嫩草影视亚洲| 日韩中文字幕一区| 超碰成人久久| 吴梦梦av在线| 欧美成人午夜| 91成人在线观看喷潮教学| 亚洲伦理一区| 亚洲 中文字幕 日韩 无码| 三级影片在线观看欧美日韩一区二区| 日本www高清视频| 日本欧美一区二区| 亚洲一级片av| 成人免费毛片高清视频| 极品粉嫩小仙女高潮喷水久久| wwww国产精品欧美| 91社区视频在线观看| 亚洲视频资源在线| 亚欧洲精品在线视频| 色综合久久久久综合体| 中文字幕日本人妻久久久免费| 正在播放一区二区| 懂色av蜜臀av粉嫩av分享吧| 日韩精品日韩在线观看| 成人高清在线| 欧美人与物videos| 亚洲第一av| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 三级视频在线观看| 欧美理论电影在线| 亚洲毛片在线播放| 日韩电影免费在线观看中文字幕| 韩国中文字幕2020精品| 欧美www在线| 国产中文在线播放| 国产玖玖精品视频| 99久久婷婷国产综合精品青牛牛 | 免费资源在线观看| 久久激情视频免费观看| 岛国av在线网站| 国产精品偷伦视频免费观看国产| 日本一区二区三区电影免费观看| 精品日本一区二区| 亚洲区综合中文字幕日日| 国产乱子伦农村叉叉叉| 精品一区二区三区影院在线午夜| 国产精品扒开腿做爽爽爽a片唱戏| aa视频在线观看| 欧美日韩亚洲视频一区| 亚洲中文无码av在线| 精品国产伦一区二区三区免费 | 中文字幕 国产| 亚洲精品一区二区在线观看| 成人在线视频成人| 国内外成人免费激情在线视频| 国产成人77亚洲精品www| 国产乱码精品一区二区三区卡| 色婷婷色综合| 妺妺窝人体色www在线小说| 韩国精品一区二区| 黄色aaa视频| 精品久久久久久| av老司机久久| 日韩在线小视频| 亚洲天堂av影院| 国产福利久久精品| 91精品蜜臀一区二区三区在线| 久久婷婷国产精品| 成人免费视频网站在线观看| 中文国语毛片高清视频| 色www精品视频在线观看| 日韩有码第一页| 欧美第一页在线| 99综合久久| 亚洲日本无吗高清不卡| 天堂av在线一区| 大地资源二中文在线影视观看| 亚洲一区二区三区四区在线免费观看 | 一本综合精品| 800av在线播放| 亚洲一二三级电影| 亚洲精品成人区在线观看| 久久不射热爱视频精品| 欧洲美女精品免费观看视频| 日韩精品av一区二区三区| 久久久999| 五级黄高潮片90分钟视频| 图片区小说区区亚洲影院| 动漫av一区二区三区| 欧美激情网友自拍| 91精品国产乱码久久久竹菊| 精品久久免费观看| 精品一区二区三区欧美| 欧美xxxooo| 3751色影院一区二区三区| 国产婷婷视频在线 | 六月丁香久久丫| www精品久久| av网站免费线看精品| 日韩手机在线观看| 精品网站999www| 免费成人美女女| 亚洲精品乱码视频| 国产制服丝袜一区| 亚洲成人生活片| 精品88久久久久88久久久| 成人观看网址| 女女同性女同一区二区三区91| 久久午夜激情| 午夜激情福利电影| 精品久久免费看| 黄频免费在线观看| 日日骚欧美日韩| 日本一区二区免费视频| 亚洲sss视频在线视频| av女名字大全列表| 国产精品久久久久久久美男| 日韩欧美视频专区| 中文字幕1区2区| 精品久久久久久久久久久| 狠狠v欧美ⅴ日韩v亚洲v大胸| 国产精品久久久久久久久免费| 久久神马影院| 国产乱淫av麻豆国产免费| 疯狂做受xxxx高潮欧美日本| 高清性色生活片在线观看| 成人网欧美在线视频| 在线成人h网| 国产美女永久免费无遮挡| 6080日韩午夜伦伦午夜伦| 国产美女情趣调教h一区二区| 久久国产精品免费一区| 蜜臀av国产精品久久久久| 欧美爱爱小视频| 亚洲视频在线视频| 99久久999| 欧美 国产 日本| 亚洲视频一区二区免费在线观看 | 亚洲精品wwwww| 精品久久毛片| 少妇人妻大乳在线视频| 欧美韩日一区二区三区四区| 午夜老司机福利| 国产91色在线|| 国产综合亚洲精品一区二| 欧美做受xxxxxⅹ性视频| 欧美一二三四在线| 欧洲一级精品| 拔插拔插海外华人免费| 国产精品视频你懂的| 日本久久一级片| 成人啪啪免费看|