据我所知,有三种方法可以在 COM 中实现编码:
- 类型库编码
- 代理/ stub 编码
- 通过对象实现 IMarshal
现在组件消费者(用户)如何选择使用哪一个?它是自行决定并使用首选方式,还是调用一些内置函数并为其解决问题?
我目前遇到以下情况:我的组件实现了一个自定义接口(interface) ICustomInterface
,该接口(interface)也由另一家公司的组件实现。我的组件没有类型库,也没有实现 IMarshal。系统注册表包含 HKCR\Interface{uuidof(ICustomInterface)}\ProxyStubClsid32 键和代理/ stub 的 GUID,可以追溯到其他公司提供的库。
现在,当我的组件使用者初始化我的组件时,它会调用 QueryInterface() 从我的组件请求 IMarshal,当返回 E_NOINTERFACE 时,它什么也不做。这是为什么 - 为什么其他公司的代理/ stub 库不启动?
最佳答案
如果您通过在 HKCR 下添加其 CLSID
(其中 {iid} 是您界面的 GUID)。您还需要注册一个类型库,以便运行时提取参数信息,并且您只能使用特定类型的子集。还有一些(旧)信息 here和 here .{00020424-0000-0000-C000-000000000046}
将接口(interface)标记为使用标准编码器,COM 运行时将使用 typelib (oleautomation) 编码\Interfaces\{iid}\ProxyStubClsid
如果您想使用由 MIDL 编译器从您的 IDL 生成的自定义代理/ stub ,则您需要将接口(interface)注册表条目更改为该代理对象的 CLSID。这使您能够使用更广泛的类型,例如“原始”数组。
如果您支持 IMarshal
,那么将优先使用这两种机制。这意味着您可以更改对象以聚合自由线程编码(marshal)拆收器(使用其 IMarshal
的实现),而无需更改注册表中的任何内容。这将避免创建任何代理。
希望这对您有所帮助。
关于windows - COM 如何选择如何编码接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1720689/