gpt4 book ai didi

com - 为什么 COM 忽略我的 DllSurrogate 条目?

转载 作者:行者123 更新时间:2023-12-05 00:02:06 25 4
gpt4 key购买 nike

我知道 this question ,但我已经按照那里列出的步骤进行操作,但我仍然很难过。

我有一个类,注册如下(这是一个 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_ALLCComPtr<IPlugin>::CoCreateInstance .

简而言之,据我所知,我关注了 the checklist :
  • 我在我的 CLSID 下指定了一个 AppID 值。我有一个相应的 AppID key 。
  • 我已包含 CLSCTX_LOCAL_SERVER在激活调用中。我的 CLSID key 没有任何 LocalServer key 。
  • 我的 CLSID key 包含一个 InprocServer32 key 。
  • 我假设当 list 说“存在 InprocServer32 中指定的代理/ stub DLL”时,它的意思是“实现 DLL”。它确实存在。我的代理/ stub DLL 在其他地方正确注册。
  • 我的 AppID 键下有一个 DllSurrogate 值。

  • 如果我在 OLE/COM 对象查看器中查看我的类,它似乎是正确的(实现选项卡已选中“使用代理进程”)。

    它仍然无法正常工作:我的 DLL 正在加载到与我的主机 EXE 相同的进程中。

    一条线索:如果我运行进程监视器,我看不到它正在寻找 CLSID\{...}\AppID值(value)。如果我通过 CLSCTX_LOCAL_SERVER到 CoCreateInstance,我得到“类未注册”返回。

    我在 Windows 2008 x64 上,但我尝试使用为 x86 和 x64 编译的代码,结果相同。

    我错过了什么?

    最佳答案

    您必须指定 CLSCTX_LOCAL_SERVER到 CoCreateInstance() 以强制执行进程外激活。这是 DCOM 的特性 - 如果您的组件注册为进程内 COM 服务器,并且您指定了一个 CLSCTX_ 掩码,包括进程内激活的任何值,则组件在进程内激活 - 不使用 DCOM。

    请注意,COM+ 提供几乎相同的功能,但如果您创建“服务器应用程序”并在其中添加组件,然后指定 CLSCTX_ALL,则组件将在 COM+ 代理中实例化 - 将自动选择进程外激活。

    关于com - 为什么 COM 忽略我的 DllSurrogate 条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1880288/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com