windows - COM 如何选择如何编码接口(interface)?

标签 windows com interop com-interop

据我所知,有三种方法可以在 COM 中实现编码:

  • 类型库编码
  • 代理/ stub 编码
  • 通过对象实现 IMarshal

现在组件消费者(用户)如何选择使用哪一个?它是自行决定并使用首选方式,还是调用一些内置函数并为其解决问题?

我目前遇到以下情况:我的组件实现了一个自定义接口(interface) ICustomInterface,该接口(interface)也由另一家公司的组件实现。我的组件没有类型库,也没有实现 IMarshal。系统注册表包含 HKCR\Interface{uuidof(ICustomInterface)}\ProxyStubClsid32 键和代理/ stub 的 GUID,可以追溯到其他公司提供的库。

现在,当我的组件使用者初始化我的组件时,它会调用 QueryInterface() 从我的组件请求 IMarshal,当返回 E_NOINTERFACE 时,它什么也不做。这是为什么 - 为什么其他公司的代理/ stub 库不启动?

最佳答案

如果您通过在 HKCR 下添加其 CLSID {00020424-0000-0000-C000-000000000046} 将接口(interface)标记为使用标准编码器,COM 运行时将使用 typelib (oleautomation) 编码\Interfaces\{iid}\ProxyStubClsid(其中 {iid} 是您界面的 GUID)。您还需要注册一个类型库,以便运行时提取参数信息,并且您只能使用特定类型的子集。还有一些(旧)信息 herehere .

如果您想使用由 MIDL 编译器从您的 IDL 生成的自定义代理/ stub ,则您需要将接口(interface)注册表条目更改为该代理对象的 CLSID。这使您能够使用更广泛的类型,例如“原始”数组。

如果您支持 IMarshal,那么将优先使用这两种机制。这意味着您可以更改对象以聚合自由线程编码(marshal)拆收器(使用其 IMarshal 的实现),而无需更改注册表中的任何内容。这将避免创建任何代理。

希望这对您有所帮助。

关于windows - COM 如何选择如何编码接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1720689/

相关文章:

java - 在 Windows 中使用 java 查找特定的注册表项

windows - 是否有任何 XSLT 处理命令行工具?

c++ - 如何测试 Audio Session 的相等性

c# - 处置Microsoft.Office.Interop.Word.Application

c# - 使用 Interop.MODI 引发 0x80040154 异常

.net - 在哪里可以找到 atof 的 .net 实现?

c++ - 如何捕获浏览的url?

c++ - 使用 Qt5 在 Windows 上获取 HWND(来自 WId)

c++ - COM dll 服务器和 COM exe 服务器有什么区别?

visual-studio-2008 - .rgs文件中的注释的语法是什么