一:背景1.讲故事最近遇到了好几起和 COM
相关的Dump,由于对 COM 整体运作不是很了解 , 所以分析此类dump还是比较头疼的 , 比如下面这个经典的 COM 调用栈 。
0:044> ~~[138c]swin32u!NtUserMessageCall+0x14:00007ffc`5c891184 c3ret0:061> k # Child-SPRetAddrCall Site00 0000008c`00ffec68 00007ffc`5f21bfbewin32u!NtUserMessageCall+0x1401 0000008c`00ffec70 00007ffc`5f21be38user32!SendMessageWorker+0x11e02 0000008c`00ffed10 00007ffc`124fd4afuser32!SendMessageW+0xf803 0000008c`00ffed70 00007ffc`125e943bxxx!DllUnregisterServer+0x3029f04 0000008c`00ffeda0 00007ffc`125e9685xxx!DllUnregisterServer+0x11c22b05 0000008c`00ffede0 00007ffc`600b50e7xxx!DllUnregisterServer+0x11c47506 0000008c`00ffee20 00007ffc`60093ccdntdll!LdrpCallInitRoutine+0x6f07 0000008c`00ffee90 00007ffc`60092eefntdll!LdrpProcessDetachNode+0xf508 0000008c`00ffef60 00007ffc`600ae319ntdll!LdrpUnloadNode+0x3f09 0000008c`00ffefb0 00007ffc`600ae293ntdll!LdrpDecrementModuleLoadCountEx+0x710a 0000008c`00ffefe0 00007ffc`5cd7c00entdll!LdrUnloadDll+0x930b 0000008c`00fff010 00007ffc`5d47cf78KERNELBASE!FreeLibrary+0x1e0c 0000008c`00fff040 00007ffc`5d447aa3combase!CClassCache::CDllPathEntry::CFinishObject::Finish+0x28 [onecore\com\combase\objact\dllcache.cxx @ 3420]0d 0000008c`00fff070 00007ffc`5d4471a9combase!CClassCache::CFinishComposite::Finish+0x4b [onecore\com\combase\objact\dllcache.cxx @ 3530]0e 0000008c`00fff0a0 00007ffc`5d3f1499combase!CClassCache::FreeUnused+0xdd [onecore\com\combase\objact\dllcache.cxx @ 6547]0f 0000008c`00fff650 00007ffc`5d3f13c7combase!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`6008a019combase!CDllHost::MTADllUnloadCallback+0x17 [onecore\com\combase\objact\dllhost.cxx @ 929]12 0000008c`00fff6c0 00007ffc`6008bec4ntdll!TppTimerpExecuteCallback+0xa913 0000008c`00fff710 00007ffc`5f167e94ntdll!TppWorkerThread+0x64414 0000008c`00fffa00 00007ffc`600d7ad1kernel32!BaseThreadInitThunk+0x1415 0000008c`00fffa30 00000000`00000000ntdll!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
- ProgId
FlyCom.Show
。- DispId
Show
, 后续再聊 。
经验总结扩展阅读
- 直行车道右转被拍几率大不大
- 细聊.Net Core中IServiceScope的工作方式
- 被正式确诊为xx是什么梗
- 密接和次密接一般多久会被通知 密接者与次密接者通常多久会被通知
- 哪几个星座的真心最容易被喜欢的人无视
- 美女被迫嫁丑男是哪部电视剧?
- 我的世界马怎么驯服怎么判断马被完全驯服(我的世界如何驯服马教程)
- 遇人不淑分手后还会被前任抹黑的星座女
- 防盗门锁芯自己能换吗 锁芯被卡住的原因
- 火灾最容易被熄灭的阶段是