我正在浏览一个代码,它有一个带有COM服务器的exe(在ATL中实现的COM类)。 它有一个.idl文件,定义了所有接口。 现在注册COM服务器后,我浏览了注册表项,我可以找到以下内容。 每个接口都有一个带有IID的条目,并且具有ProxyStubClsid32。 有一个接口由我提到的COM服务器实现,其在关键字段中具有IID = ProxyStubClsid32的值,并且每个其他接口接口条目在其ProxyStubClsid32字段中具有相同的IID条目。 为什么会这样?
接下来,当我尝试添加一个新接口和实现此接口的新COM组件到exe,并进行其注册时我在注册表中可以观察到的是现在这个新接口的IID条目及其ProxyStubClsid32是相同的。 现在,新添加的IID存在于所有其他接口的ProxyStubClsid32中。
什么进入ProxyStubClsid32,这是如何决定的?
我希望在添加新界面之后,先前的IID出现在ProxyStubClsid32中。我怎么能这样做?
explorer.exe也缓存此注册表项,因为我正在实现加载组件的shell扩展,我认为它是指旧条目,因此查询该exe上的新接口不起作用。一旦我重新启动explorer.exe一切正常。
任何人都可以对此发表评论。
对此问题的回答似乎对我的问题有一些提示:Registry keys for out-of-process COM server
提前致谢。
答案 0 :(得分:0)
ProxyStubClsid32中的内容实际上是用于MIDL编组的接口。使用它是因为你的接口继承自IDispatch并且是必需的,所以编译器会负责编组(因为它是一个OOP服务器,你需要编组)。
对于我们的团队,我们在某些机器上注册服务器时遇到了一些问题(/ RegServer还不够),但是使用带有此代码的小exe修复了所有注册问题(以及您可能遇到的E_NOINTERFACE问题),只需在每次构建或安装后调用它:
// Register the server
String^ l_TLB = l_Path + "\\MyServer.tlb";
IntPtr l_TLBP = System::Runtime::InteropServices::Marshal::StringToBSTR(l_TLB);
ITypeLib *pTypeLib;
HRESULT hr;
hr = LoadTypeLibEx(static_cast<LPCOLESTR>(l_TLBP.ToPointer()), REGKIND_REGISTER, &pTypeLib);
if(SUCCEEDED(hr))
pTypeLib->Release();