将新接口和组件添加到进程外COM服务器后更改注册表项

时间:2013-03-30 15:00:09

标签: com atl out-of-process

我正在浏览一个代码,它有一个带有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

提前致谢。

1 个答案:

答案 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();