我如何配置DCOM将我的DLL加载到一个单独的进程?

时间:2009-11-10 08:40:17

标签: windows com com-interop atl dcom

我正在尝试将现有的本机C ++ ATL进程内COM服务器强制转换为单独的进程。我希望DCOM能够在不改变COM服务器的情况下为我做到这一点。

我从通常的注册表设置开始 - 我有一个HKCR \ CLSID {classId}条目和一个InProcServer32密钥,指定.dll文件的路径。

我生成了一个应用程序ID(GUID)并在此处添加了它。具体来说,我在HKCR \ CLSID {classId}下添加了一个等于应用程序ID的字符串值“AppId”。我还添加了一个HKCR \ AppId {applicationId}键和一个字符串值“DllSurrogate”等于一个空字符串。我认为将我的COM服务器强制转换为默认的系统提供的代理就足够了。

DCOM应用程序出现在DCOM配置控制台中。但是,当我调用CoCreateInstance()CoGetClassObject()并提供类ID和CLSCTX_LOCAL_SERVER时,它会返回“未注册的类”。我做错了什么?

UPD:已解决。所采取的步骤足以使其工作,除了我正在编辑注册表中的错误的类ID,由于某种原因在InProcServer32密钥下有相同的路径 - 也许这是一个COM地狱问题。

3 个答案:

答案 0 :(得分:2)

错误的注册表项。你需要在HKCR \ CLSID {classId}中设置LocalServer32,而不是InProcServer32。

但是,Windows无法实例化DLL。因此,您需要将程序更改为完整的COM服务器exe。 Windows将启动您的EXE并发送参数/嵌入。然后,您可以创建CComModule并启动您的程序。

答案 1 :(得分:2)

Follow the check list

  1. 必须在注册表中的CLSID项下指定AppID值,并且必须具有相应的AppID键。 (的检查
  2. 在激活调用中,CLSCTX_LOCAL_SERVER位已设置且CLSID键未指定LocalServer32,LocalServer或LocalService。 (的检查
  3. CLSID键包含InprocServer32子项。 (的检查
  4. 存在InprocServer32密钥中指定的代理/存根DLL。的 ???
  5. AppID键下存在DllSurrogate值。 (的检查

答案 2 :(得分:0)

这不是DLLHOST.EXE的用途吗?