我知道这个问题 https://stackoverflow.com/questions/1706429/how-exactly-do-i-config-dcom-to-load-my-dll-into-a-separate-process,但我已经按照那里列出的步骤进行操作,但我仍然感到困惑。
我有一个类,注册如下(这是一个 RGS 文件):
HKCR
{
NoRemove CLSID
{
ForceRemove {5CB1D770-BF72-4F3D-B4DA-85E0542126F4} = s 'ExamplePlugin Class'
{
val AppID = s '%APPID%'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Free'
}
}
}
}
我有一个AppID,注册如下:
HKCR
{
NoRemove AppID
{
'%APPID%' = s 'ExamplePlugin'
{
val DllSurrogate = s ''
}
'ExamplePlugin.DLL'
{
val AppID = s '%APPID%'
}
}
}
我路过CLSCTX_ALL
to CComPtr<IPlugin>::CoCreateInstance
.
简而言之,据我所知,我已经遵循了清单 http://msdn.microsoft.com/en-us/library/ms686606.aspx:
- 我的 CLSID 下指定了一个 AppID 值。我有一个相应的AppID密钥。
- 我已经包括了
CLSCTX_LOCAL_SERVER
在激活调用中。我的 CLSID 密钥没有任何 LocalServer 密钥。
- 我的 CLSID 密钥包含 InprocServer32 密钥。
- 我假设当清单显示“InprocServer32 中指定的代理/存根 DLL 存在”时,它意味着“实现 DLL”。它确实存在。我的代理/存根 DLL 在其他地方正确注册。
- 我的 AppID 键下有一个 DllSurrogate 值。
如果我在 OLE/COM 对象查看器中查看我的类,它似乎是正确的(“实现”选项卡选中了“使用代理进程”)。
它仍然无法工作:我的 DLL 正在加载到与我的主机 EXE 相同的进程中。
线索:如果我运行进程监视器,我看不到它在寻找CLSID\{...}\AppID
价值。如果我通过了CLSCTX_LOCAL_SERVER
对于 CoCreateInstance,我得到“类未注册”返回。
我使用的是 Windows 2008 x64,但我尝试过为 x86 和 x64 编译代码,得到相同的结果。
我缺少什么?
你必须指定CLSCTX_LOCAL_SERVER
到 CoCreateInstance() 以强制执行进程外激活。这是 DCOM 的特性 - 如果您的组件注册为进程内 COM 服务器,并且您指定了一个 CLSCTX_ 掩码(包括进程内激活的任何值),则组件将在进程内激活 - 不使用 DCOM。
请注意,COM+ 提供几乎相同的功能,但如果您创建“服务器应用程序”并在其中添加组件,然后指定 CLSCTX_ALL,则该组件将在 COM+ 代理中实例化 - 将自动选择进程外激活。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)