gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:26:28 25 4
gpt4 key购买 nike

据我所知,有三种方法可以在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com