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

Dab*_*ler 0 com out-of-process

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

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

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

我不明白第二个键的值是如何与<GUID>键名相同的值,因为我目前的理解是这样

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

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

编辑:我仍然希望得到这个答案.简而言之:由于组件和接口是两个不同的东西,如何同时使用相同的ID?

Han*_*ant 6

您对COM中使用Guids的方式的基本理解是正确的.值得注意的是,具有相同guid的接口和coclass不是问题.它们存在于不同的注册表项HKCR\Interface vs HKCR\CLSID中,无论您是在查找IID还是CLSID,它始终在COM中清除.

第二个是你写的IDL.请注意,没有地方可以指定代理的CLSID,只能在那里声明代理和存根支持的IID.

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

编译开关:

-DPROXY_CLSID=clsid
    Specifies a class ID to be used by the proxy DLL.
Run Code Online (Sandbox Code Playgroud)

您使用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
Run Code Online (Sandbox Code Playgroud)

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

这使得ProxyStubClsid32 guid与第一个接口的IID相同.功能,而不是错误.