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

2024-04-11

我知道这个问题 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:

  1. 我的 CLSID 下指定了一个 AppID 值。我有一个相应的AppID密钥。
  2. 我已经包括了CLSCTX_LOCAL_SERVER在激活调用中。我的 CLSID 密钥没有任何 LocalServer 密钥。
  3. 我的 CLSID 密钥包含 InprocServer32 密钥。
  4. 我假设当清单显示“InprocServer32 中指定的代理/存根 DLL 存在”时,它意味着“实现 DLL”。它确实存在。我的代理/存根 DLL 在其他地方正确注册。
  5. 我的 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(使用前将#替换为@)

为什么 COM 忽略我的 DllSurrogate 条目? 的相关文章

  • 如何使用 CoCreateInstance() 获取 com 对象?

    我已经注册了一个COM组件 我想调用它 CLSID clsid RIID iid HRESULT hr CLSIDFromProgID OLESTR se mysoft clsid LPVOID pRet HRESULT hr1 CoCre
  • 64 位 Windows 上的 32 位和 64 位互操作性

    是否有讨论 32 位和 64 位进程之间的互操作性的全面权威参考资料 根据谷歌搜索 我推断出 32位DLL只能驻留在32位进程中 64位DLL只能驻留在64位进程中 32位和64位进程只能使用松散耦合的消息系统进行通信 例如网络通信 这意味
  • COM 返回未实现任何接口的类型

    我需要通过 NET 4 0 应用程序自动执行 Adob e InDesign CS3 中的一些任务 我已使用 Visual Studio 中的 添加引用 对话框添加了对 InDesign 类型库的引用 它生成一个互操作程序集 该程序集正确包
  • 将 BSTR 转换为 LPCWSTR

    这是我的需要 BSTR l strArgs LPCWSTR sth OutputDebugStringW sth 如何将 BSTR 转换为 LPCWSTR 是否有任何仅标头的库可以将任何字符串类型 微软 转换为 LPCWSTR 类型 只需覆
  • Mac OS 中的 COM 相当于什么?

    我是 Mac 编程领域的新手 有人可以告诉我 Mac 中可重用 COM 组件的等效项是什么 以及一些入门资源的链接 创建可重用的类似 COM 的组件并从调用应用程序引用这些组件 吗 谢谢 澄清 我想知道是否存在类似的技术 在操作系统级别受支
  • VB.NET 和 COM Interop 看似随机崩溃

    我正在考虑用 VB 6 重写一个全新的 VB NET 应用程序 该应用程序在终端服务下运行并大量使用 COM 由于某种原因 该应用程序存在随机奇怪之处 随机访问冲突错误 WinDbg 异常分析指向 dll 如 comdlg32 dll ms
  • 为什么 COM 忽略我的 DllSurrogate 条目?

    我知道这个问题 https stackoverflow com questions 1706429 how exactly do i config dcom to load my dll into a separate process 但我
  • 注册 COM 接口的实现

    我是 COM 编程新手 我已经准备好了一个 COM 对象 以及关联的 IClassFactory 但我不太清楚如何注册生成的 DLL 以供其他程序使用 我也不清楚需要携带的 GUID 数量 我尝试注册的 COM 对象实现了 IAudioSe
  • 在没有 ResetEvent 的情况下调用 setEvent

    如果使用 setEvent 设置手动重置事件但未使用 ResetEvent 重置 会发生什么情况 并且该事件被触发多次 即当事件被处理时 事件再次被设置 以下是示例任务 void foo SetEvent hEvent1 void foo1
  • 是否可以自动化即点即用应用程序?

    我有一个小型应用程序 可以通过 COM OLE 自动化实现 Microsoft Word 的自动化 不幸的是 这不适用于虚拟化的即点即用版本的 Word 因为它们在注册表中没有所需的密钥 至少不是预期的位置 换句话说 CreateObjec
  • Java 中的 Com 对象,可能吗?

    抱歉 我问了一个愚蠢的问题 但我没有任何关于 java 的经验 也没有关于 jvm 的经验 而且它是内部结构 谷歌搜索主题没有给出结果 问题是是否可以用Java编写com对象 然后从 C 运行它 Thanks 是的 您可以使用 Java 中
  • 以编程方式启动和停止 IIS Express

    我正在尝试用 C 构建一个小型应用程序 它应该启动 停止 IIS Express 工作进程 为此 我想使用 MSDN 上记录的官方 IIS Express API http msdn microsoft com en us library
  • 具有多个参数的 COM“获取属性”

    我正在尝试打电话WindowsInstaller Installer ProductsEx http msdn microsoft com en us library aa369461 28v vs 85 29 aspx来自 python
  • 如何从 C# 等托管代码中使用 ActiveX 组件的嵌入式免注册清单?

    我想使用未在系统或用户范围内注册的特定版本的 ActiveX 组件 如果我使用清单文件 一切都会按预期工作 但是 嵌入式清单仅适用于 C 客户端代码 这是依赖声明
  • 如何在对话框中托管预览处理程序

    我正在尝试在对话框中托管文件预览处理程序 我已经为资源管理器中的选择更改设置了一个事件接收器 当选择更改时 我将选定的 shell 项目提供给对话框 该对话框又将其提供给准备预览帧的函数 一般来说 它会成功加载正确的处理程序并显示文件的内容
  • IRunningObjectTable.Register 始终将 pdwRegister 设置为 65536,这是一个无效值

    我在用着IRunningObjectTable Register and IRunningObjectTable Revoke如图所示this http www codeproject com KB COM ROTStuff aspx ms
  • Delphi COM 对象中的早期绑定和后期绑定在性能方面哪个更好

    在delphi中 如果要创建COM对象 可以通过两种方式来完成 第一个是早期绑定 例如 uses MSScriptControl TLB MS Script Control var obj IScriptControl begin obj
  • 调用 Word.Documents.Add 后 WinWord.exe 不会退出 - Word .NET Interop

    我遇到了一个经典场景 即在 NET 中创建 Word COM 对象 通过 Microsoft Office Interop Word 程序集 时 WinWord 进程不会退出 即使我正确关闭和释放物体 http www xtremevbta
  • VBA COM 库中的这些 _B_var_Xxxxx 和 _B_str_Xxxxx 成员到底是什么?

    想象一下以下函数调用 foo UCase bar 我正在解析这段代码 并确定UCase是一个函数调用 现在我想将该函数调用解析为定义它的 COM 库中函数的声明 这个想法是实现一个代码检查来确定何时Variant当使用内置函数时String
  • tlb 文件是否具有关联架构?

    我有一个 32 位 DLL 旨在通过 com 模型和关联的 tlb 文件进行访问 该 DLL 似乎是 x86 有没有办法从 x64 程序访问这种 DLL tlb 文件与 x86 x64 无关吗 我问这个问题是因为有些功能似乎可以工作 其他功

随机推荐