gpt4 book ai didi

com - 进程外 COM 服务器的注册表项

转载 作者:行者123 更新时间:2023-12-05 00:50:22 26 4
gpt4 key购买 nike

我正在实现我的第一个进程外 COM 服务器(我的第一个 COM 服务器,就此而言)。我已经按照步骤编写了一个 IDL 文件,为代理/ stub DLL 生成代码,编译 DLL,并注册它。

当我检查注册表项时,我有

  • 一个名为 HKEY_CLASSES_ROOT/Interface/<GUID> 的键,其值是(比如说)IMyApp
  • 一个名为 HKEY_CLASSES_ROOT/Interface/<GUID>/ProxyStubClsid32 的键, 其值为 <GUID> ,即与键名中的值相同

我不明白第二个键的值怎么会一样 <GUID>键名中的值,因为我目前的理解是

  • HKEY_CLASSES_ROOT/Interface/<GUID> , GUID 是一个接口(interface) ID
  • ProxyStubClsid32不是接口(interface)ID,而是classID,指的是实现上述接口(interface)的组件
  • HKEY_CLASSES_ROOT/CLSID/<GUID>/InprocServer32 的值(其中 GUID 是上面的 class ID)指向代理 DLL

那么,HKEY_CLASSES_ROOT/Interface/<GUID>/ProxyStubClsid32 的值如何?如果一个是接口(interface) ID,另一个是类 ID,是否保持相同的值 GUID?

编辑:我仍然希望得到这个答案。简而言之:既然组件和接口(interface)是两个不同的东西,那么相同的 ID 怎么能同时用于两者呢?

最佳答案

您对在 COM 中使用 Guid 的方式的基本理解是正确的。首先值得注意的是,具有相同 guid 的接口(interface)和 coclass 不是问题。它们存在于不同的注册表项中,HKCR\Interface 与 HKCR\CLSID,并且在 COM 中始终清楚您是在查找 IID 还是 CLSID。

其次是您编写的 IDL。请注意,此处没有指定代理的 CLSID 的位置,只能在此处声明代理和 stub 支持的 IID。

接下来,您需要通过代理/ stub 自动生成的方式进行一次疯狂的追逐。核心 Windows SDK 头文件是 RpcProxy.h,在文本编辑器中打开它来查看。宏汤很重,但确实有一些不错的评论来描述正在发生的事情。重要的 RPC 帮助函数是 NdrDllRegisterProxy(),它注册代理并在您使用 Regsvr32.exe 时调用。它的第三个参数指定代理的 CLSID。我会让您阅读并仅引用 .h 文件中的重要部分:

Compiler switches:

-DPROXY_CLSID=clsid
Specifies a class ID to be used by the proxy DLL.

您可以使用 Project + Properties、C/C++、Preprocessor、Preprocessor Definitions 设置指定此选项。请注意,您的项目将不会指定它。

在汤中追逐,然后让你找到这个:

// if the user specified an override for the class id, it is
// PROXY_CLSID at this point

#ifndef PROXY_CLSID
#define GET_DLL_CLSID \
( aProxyFileList[0]->pStubVtblList[0] != 0 ? \
aProxyFileList[0]->pStubVtblList[0]->header.piid : 0)
#else //PROXY_CLSID
#define GET_DLL_CLSID &PROXY_CLSID
#endif //PROXY_CLSID

换句话说,如果您自己没有指定 CLSID(您没有),那么它将使用 stub 表中的第一个 IID

这使得 ProxyStubClsid32 guid 与您的第一个接口(interface)的 IID 相同。功能,而不是错误。

关于com - 进程外 COM 服务器的注册表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12979501/

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