3

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

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

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

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

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

4

3 回答 3

2

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

但是,Windows 不能实例化 DLL。所以你需要把你的程序改成一个完整的COM服务器exe。Windows 将启动您的 EXE 并发送参数 /embedding。然后您可以创建 CComModule 并启动您的程序。

于 2009-11-10T08:44:45.007 回答
2

按照检查清单

  1. 注册表中的 CLSID 键下必须有一个 AppID 值,以及对应的 AppID 键。(选中
  2. 在激活调用中,该CLSCTX_LOCAL_SERVER位被设置并且 CLSID 键不指定 LocalServer32、LocalServer 或 LocalService。(选中
  3. CLSID 项包含 InprocServer32 子项。(选中
  4. InprocServer32 项中指定的代理/存根 DLL 存在。???
  5. DllSurrogate 值存在于 AppID 项下。(选中
于 2009-11-10T09:08:31.043 回答
0

这不是 DLLHOST.EXE 的用途吗?

于 2009-11-10T09:13:16.387 回答