我试图将现有的 native 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 编辑注册表,该类 ID 由于某种原因在 InProcServer32 键下具有相同的路径 - 也许这是一个 COM hell 问题。
最佳答案
- 必须在注册表中的 CLSID 键下指定一个 AppID 值,以及一个相应的 AppID 键。 (检查)
- 在激活调用中,设置了
CLSCTX_LOCAL_SERVER
位并且 CLSID key 未指定 LocalServer32、LocalServer 或 LocalService。 (检查) - CLSID 键包含 InprocServer32 子键。 (检查)
- InprocServer32 键中指定的代理/ stub DLL 存在。 ???
- AppID 键下存在 DllSurrogate 值。 (检查)
关于windows - 我究竟应该如何配置 DCOM 以将我的 DLL 加载到一个单独的进程中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1706429/