精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人资源www网在线最新版| 国产91av视频| 日本免费一区二区三区等视频| 国产精品全国免费观看高清| 91情侣偷在线精品国产| 国产亚洲成人av| 免费观看久久av| 欧美电影在线免费观看| 亚洲 自拍 另类小说综合图区| 欧洲视频在线免费观看| 国产一区二区三区四区五区入口| 韩国福利视频一区| 狂野欧美性猛交| 美女午夜精品| 欧美一区日韩一区| www.国产区| 色婷婷av在线| 中文字幕av免费专区久久| 成人动漫视频在线观看完整版| 69成人免费视频| 自产国语精品视频| 亚洲视频综合网| 免费啪视频在线观看| 国产91在线精品| 精品久久久久久久久久久久| 国产四区在线观看| 三级黄视频在线观看| 国产精品自拍在线| 国产精品无av码在线观看| 黄色片视频网站| 91综合久久| 亚洲人成啪啪网站| 中文在线永久免费观看| 精品视频在线一区| 欧美日产国产精品| 免费黄色一级网站| 韩国美女久久| 欧美三级xxx| 免费观看国产精品视频| a毛片在线观看| **网站欧美大片在线观看| 欧美日韩国产精品一卡| 天堂网av2014| 成人动漫在线一区| 成人欧美一区二区三区在线观看| 亚洲系列第一页| 免费的成人av| 国产精品久久中文| 69av视频在线观看| 免费日韩av| 青草青草久热精品视频在线网站| 国产精品成人aaaa在线| 国产综合视频| 欧美理论片在线观看| 劲爆欧美第一页| 午夜日韩电影| 久久久久久久网站| 日韩精品视频免费看| 影音先锋亚洲精品| 97激碰免费视频| 中文字字幕在线中文| 亚洲综合二区| 国产成人一区二区三区| 国产精华7777777| 七七婷婷婷婷精品国产| 国产精品久久久久久婷婷天堂| 波多野结衣视频观看| 日韩国产高清影视| 国产精品一区久久| 国产精品无码AV| 国产乱人伦精品一区二区在线观看 | 波多野结衣中文字幕在线播放| 国产精品日本一区二区不卡视频| 欧美一区午夜精品| 亚洲av成人精品一区二区三区 | 精品国精品自拍自在线| 97精品人妻一区二区三区蜜桃| 麻豆一区一区三区四区| 国产一区二区三区在线观看视频| 污污视频网站在线免费观看| 欧美fxxxxxx另类| 国产69精品久久久久9999| 9i看片成人免费看片| 麻豆高清免费国产一区| 97自拍视频| 每日更新av在线播放| 国产精品视频一区二区三区不卡| 成年人免费观看的视频| 91九色在线看| 欧美性猛交xxxx黑人交| 国产精品欧美性爱| 国产91精品对白在线播放| 久久精品国产免费观看| 日韩精品一区二区av| 日韩精品三区四区| 成人xxxxx色| 91精品专区| 亚洲国产成人高清精品| 欧美伦理片在线看| 日韩在线亚洲| 亚洲性生活视频| 国产在线拍揄自揄拍无码视频| 免费日韩精品中文字幕视频在线| 96国产粉嫩美女| 三区在线视频| 亚洲一级二级三级在线免费观看| 成人免费观看毛片| 日韩精品成人| 中文字幕精品视频| 色婷婷av国产精品| 国产精品资源在线看| 欧美日韩系列| 俄罗斯一级**毛片在线播放| 欧美日韩免费视频| 亚洲调教欧美在线| 欧美国产精品| 国产精品丝袜久久久久久不卡| 日本激情一区二区三区| 亚洲男人的天堂网| 国产嫩草在线观看| 欧美人成在线观看ccc36| 美女精品久久久| 亚洲视屏在线观看| 久久久久久久久99精品| 国产人妻777人伦精品hd| **精品中文字幕一区二区三区| 亚洲欧美日韩在线一区| 亚洲欧美在线观看视频| 国产成人精品亚洲777人妖| 一区在线电影| 国产精品黄色片| 亚洲图中文字幕| 西西44rtwww国产精品| 成人精品视频网站| 污污污污污污www网站免费| 综合久久av| www国产精品com| 一区二区视频网| 国产日韩欧美在线一区| 男女av免费观看| 性人久久久久| 青青在线视频一区二区三区| 少妇精品高潮欲妇又嫩中文字幕| 亚洲一区二区三区免费视频| 波多野结衣在线免费观看| 亚洲成人精品| 97碰碰视频| 超碰在线97国产| 亚洲精品在线一区二区| 日韩精品视频播放| 久久久久久麻豆| 中文字幕欧美人妻精品一区| 狠狠做六月爱婷婷综合aⅴ| 国产成人精品最新| 超碰免费97在线观看| 欧美性猛交xxxx乱大交退制版| 蜜臀久久99精品久久久久久| 日韩二区三区在线观看| 日韩一区不卡| 亚洲黑人在线| 欧美国产日本在线| 偷拍精品一区二区三区| 色综合欧美在线视频区| 国产ts在线播放| 日本在线观看不卡视频| 国产精品波多野结衣| 中文成人在线| 久久久久久久影院| 日韩私人影院| 欧美四级电影网| 免费中文字幕日韩| 成人黄色大片在线观看| 欧美日韩中文在线视频| 99re6这里只有精品| 91网免费观看| 成人亚洲欧美| 久久精品视频导航| 欧美一级做性受免费大片免费| 欧美性猛交xxxx免费看漫画| 黄色av免费播放| 国产乱码一区二区三区| 国产精品后入内射日本在线观看| 精品午夜久久| 亚洲精品欧美日韩| 在线能看的av网址| 日韩中文字幕精品视频| 女人18毛片水真多18精品| 色偷偷一区二区三区| 紧身裙女教师波多野结衣| caoporn国产精品| 亚洲天堂2018av| 国内精品嫩模av私拍在线观看| 久久久久久国产精品免费免费| 成人av集中营| 国外成人免费在线播放| 95在线视频| 亚洲第一av在线| 中文字幕在线播放av| 亚洲成人在线免费| 天堂av免费在线| 91免费视频观看| 中文字幕avav| 日韩不卡在线观看日韩不卡视频| 99久久免费观看| 久久免费大视频| 欧美精品久久| 999国产精品一区| 国产精品影院在线观看| 性xxxxfreexxxxx欧美丶| 麻豆一区二区在线观看| 户外极限露出调教在线视频| 精品国产sm最大网站| 中文字幕一区二区三区免费看| 午夜av区久久| 2021亚洲天堂| 国产精品人成在线观看免费| 亚洲av无码国产精品久久| 国产成人在线影院| 毛片毛片毛片毛| 日韩一区精品字幕| 免费无码国产v片在线观看| 伊人久久大香线蕉综合四虎小说| 欧美重口乱码一区二区| 久久精品66| 国产91亚洲精品一区二区三区| 亚洲ww精品| 国产精品久久久久免费a∨| 亚洲黄色免费看| 午夜精品在线观看| 激情图片在线观看高清国产| 久久精品国产成人精品| 欧美a免费在线| 中文字幕av一区二区| 国产在线观看网站| 亚洲老头同性xxxxx| 午夜视频www| 亚洲成人黄色在线观看| 高清乱码毛片入口| 亚洲成人精品久久| 黄色小视频免费观看| 精品久久久影院| 成人毛片视频免费看| 欧美大胆人体bbbb| 丰满人妻熟女aⅴ一区| 日韩色在线观看| 国内毛片毛片毛片毛片| 日韩无一区二区| 精品欧美在线观看| 欧美精品一区视频| 日本久久一级片| 亚洲美女av网站| 黄色av网站在线| 深夜福利一区二区| 国产精品实拍| 欧美大秀在线观看| 男女羞羞在线观看| 国产成人精品一区二区三区| 浪潮色综合久久天堂| 国产精品久久久久久久天堂| 综合欧美精品| 国产精品一区二区欧美黑人喷潮水 | 国产精品无码久久久久久| 久久久蜜桃精品| youjizz亚洲女人| 亚洲美女屁股眼交3| 久操免费在线视频| 欧美日韩美女视频| 中文字幕乱伦视频| 91精品麻豆日日躁夜夜躁| 亚洲大尺度视频| 日韩电影中文 亚洲精品乱码| 欧美新色视频| 久久久国产视频| √最新版天堂资源网在线| 欧洲永久精品大片ww免费漫画| 99只有精品| 国产精品一区二区三区精品| 九一亚洲精品| 99久久久无码国产精品性色戒| 欧美日韩天堂| 国产福利视频在线播放| 裸体在线国模精品偷拍| 亚洲v在线观看| 国产性色一区二区| 免费在线一区二区三区| 一本大道久久a久久精二百| 国产精品亚洲欧美在线播放| 亚洲第一天堂av| 在线观看美女网站大全免费| 欧美激情国产高清| 欧美日一区二区三区| 超碰97在线人人| 欧美日韩播放| 久久久久久久香蕉| 日韩精品国产精品| 野战少妇38p| 国产精品国产三级国产aⅴ无密码| 免费中文字幕视频| 欧美日韩一区二区三区四区 | 国产一区二区三区在线看| 手机在线免费看av| 国产精品嫩草影院久久久| 国产 日韩 欧美 综合 一区| 艳色歌舞团一区二区三区| 亚洲最黄网站| 日本成人在线免费| 日本一区二区动态图| 日韩av在线播放观看| 欧美肥胖老妇做爰| 精彩国产在线| 高清欧美电影在线| 成人动漫视频在线观看| 任我爽在线视频精品一| 一区二区国产在线观看| 在线成人免费av| 欧美国产一区二区| 日本中文字幕网| 日韩视频国产视频| 蜜桃视频在线观看www社区| 日本午夜人人精品| 久9re热视频这里只有精品| 黄色录像特级片| 久久精品国内一区二区三区| 亚洲AV无码国产成人久久| 亚洲成人av一区二区三区| 精品国产伦一区二区三区| 色偷偷噜噜噜亚洲男人| 成人在线网站| 欧美一区1区三区3区公司| 国产精品综合| 制服丝袜第二页| 亚洲成人动漫在线观看| 亚洲av无码乱码国产精品久久| 久久久成人精品视频| 巨大黑人极品videos精品| 日韩欧美在线一区二区| 久久亚洲图片| 成人午夜福利一区二区| 欧美色xxxx| 黄网站在线观看| 国产成一区二区| heyzo久久| 国产精品久久a| 国产精品成人一区二区艾草| 在线观看黄色国产| 色琪琪综合男人的天堂aⅴ视频| 欧美精品高清| 视频一区亚洲| 麻豆免费看一区二区三区| 99热这里只有精品4| 制服丝袜亚洲网站| 新版中文在线官网| 国产乱码精品一区二区三区日韩精品| 精品成人国产| 国产福利短视频| 日本二三区不卡| 一本一道波多野毛片中文在线 | 亚洲手机在线观看| 久久久久www| 91精品久久久久久综合五月天| 波多野结衣综合网| 久久久久久黄色| 91麻豆成人精品国产免费网站| 久久九九免费视频| 亚洲一区二区三区在线免费| 国产精品久久..4399| 久久综合色婷婷| 五月天中文字幕| 久久999免费视频| 欧美交a欧美精品喷水| 宅男噜噜噜66国产免费观看| 一区在线观看视频| 亚洲免费国产视频| 日韩av大片免费看| 天天影视综合| 亚洲一区二区三区无码久久| 色哦色哦哦色天天综合| 51xtv成人影院| 久久av免费一区| 久久99精品久久久久| 日本一区二区三区免费视频| 亚洲天堂网站在线观看视频| 国产精品视频一区二区三区综合| 国产精品www在线观看| 日本在线www| 性猛交xxxx| 欧美亚洲在线视频| 奇米影视亚洲| 亚洲少妇中文字幕| 日本精品视频一区二区| 高清全集视频免费在线| 精品国产免费一区二区三区| 男女男精品视频| 国产精品50页| 最近的2019中文字幕免费一页| 91精品啪在线观看国产爱臀| 天堂社区在线视频| 亚洲成av人片在线观看无码| 在线免费观看黄色网址| 国产综合第一页|