Dab*_*ler 0 com out-of-process
我正在实现我的第一个进程外COM服务器(我的第一个COM服务器,就此而言).我已按照步骤编写IDL文件,生成代理/存根DLL的代码,编译DLL并注册它.
当我检查注册表项时,我有
HKEY_CLASSES_ROOT/Interface/<GUID>,其vaue(说)IMyApp和HKEY_CLASSES_ROOT/Interface/<GUID>/ProxyStubClsid32,其值为<GUID>,即与键名称中的值相同我不明白第二个键的值是如何与<GUID>键名相同的值,因为我目前的理解是这样
HKEY_CLASSES_ROOT/Interface/<GUID>,GUID是接口 IDProxyStubClsid32不是接口ID,而是一个类 ID指的是实现上述接口组件HKEY_CLASSES_ROOT/CLSID/<GUID>/InprocServer32(其中,GUID是上述类 ID)指向代理DLL那么,HKEY_CLASSES_ROOT/Interface/<GUID>/ProxyStubClsid32如果一个是接口ID而另一个是类ID ,那么如何保持相同值GUID的值?
编辑:我仍然希望得到这个答案.简而言之:由于组件和接口是两个不同的东西,如何同时使用相同的ID?
您对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文件中的重要位:
编译开关:
Run Code Online (Sandbox Code Playgroud)-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
Run Code Online (Sandbox Code Playgroud)
换句话说,如果您没有自己指定CLSID(您没有),那么它将使用存根表中的第一个IID.
这使得ProxyStubClsid32 guid与第一个接口的IID相同.功能,而不是错误.