通过准隔离COM使用EXE服务器

2023-12-20

我已经能够使用清单,特别是 MSBuild 任务GenerateApplicationManifest,以便我们的主应用程序使用独立的COM。我可以创建所需的所有在 DLL 中实现的 COM 对象,而无需在客户端计算机上注册 DLL。但是,我很贪心...

我们的应用程序套件还具有一些通常通过 COM 调用的单独应用程序。对于这些,据说你不能做EXE到EXE隔离COM。严格来说,这是事实,但我已经完成了 90%,并且在其他论坛上我看到其他人提供了完成剩余部分的线索。

对于我的 EXE 服务器,我在清单中有一个条目,其中包含 EXE 服务器的名称,并且该条目中有一个子条目,以便当 ATL 服务器调用时LoadRegTypeLib(),调用就会成功。这样可行。

当然,棘手的部分是您不能将 EXE 服务器的条目放入客户端应用程序清单中并期望CoCreateInstance()成功(通过启动服务器 EXE 并执行 COM 执行的所有其他操作。)

我能够伪造很多,因为我知道要启动哪个 EXE 服务器。我可以打电话CreateProcess()然后打电话WaitForInputidle()在客户端应用程序中,让我的服务器为客户端应用程序中的 CoCreateInstance() 做好准备。

如果我打电话CoCreateInstance()并要求IDispatch客户端界面,调用成功,可以调用Invoke()一切正常。

现在贪婪的部分来了......

IDispatch 工作得很好,但我希望能够通过从 IDispatch 派生的双接口进行调用。我想这样做,因为我有很多这样编写的代码,并且语法更简单,并且异常处理已经存在。

然而,当我打电话时QueryInterface()对于我的双接口IDispatch接口,我得到 E_NOINTERFACE 返回。我已经在服务器 EXE 中的 ATL 服务器对象中设置了断点,并且可以确认在服务器端,它找到了接口并返回 S_OK。因此,似乎接口无法以某种方式编组回客户端。

所以,问题是,我怎样才能得到QueryInterface()为了让我的自定义/双界面成功?我尝试过使用的各种组合<comInterfaceProxyStub> and <comInterfaceExternalProxyStub>在我的客户端清单(和服务器清单)中尝试封送接口,但我仍然看到E_NOINTERFACE返回我的客户端。

我几年前在另一个论坛上看到 Hans Passant 发表的评论,内容是可能需要一个单独的代理/存根 DLL 来编组接口,但没有太多细节。

是否有可能在免注册的情况下解决这个问题?是否有必要创建代理/存根库?如果是这样,我的客户端应用程序(和/或服务器应用程序和/或代理/存根 DLL)中的清单条目会是什么样子?


如果您有代理/存根 DLL,请将其作为file带有孩子的元素comInterfaceProxyStub它处理的每个接口的元素(不要忘记threadingModel属性)。

如果您有类型库,请将其作为file带有孩子的元素typelib元素,并添加一个comInterfaceExternalProxyStub类型库中每个接口的元素(不要忘记tlbid属性),其中proxyStubClsid32是自动化编组器:"{00020424-0000-0000-C000-000000000046}".

例如,如果您使用标准封送处理(代理/存根 DLL):

<assembly ...>
    <file name="myps.dll">
        <comInterfaceProxyStub iid="{iid1}"
                               name="IMyDualInterface1"
                               baseInterface="{00020400-0000-0000-C000-000000000046}"
                               numMethods="8"
                               proxyStubClsid32="{proxyStubClsid32}"
                               threadingModel="Free"
                               />
    </file>
</assembly>

如果您使用类型库封送:

<assembly ...>
    <file name="mylib.tlb">
        <typelib tlbid="{tlbid}"
                 version="1.0"
                 helpdir=""
                 />
    </file>
    <comInterfaceExternalProxyStub iid="{iid2}"
                                   baseInterface="{00020400-0000-0000-C000-000000000046}"
                                   numMethod="8"
                                   name="IMyDualInterface2"
                                   tlbid="{tlbid}"
                                   proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
                                   />
</assembly>

实际上,comInterfaceExternalProxyStub适用于任何其他注册的(非隔离的)代理/存根。例如:

<assembly ...>
    <comInterfaceExternalProxyStub iid="{iid2}"
                                   baseInterface="{00000000-0000-0000-C000-000000000046}"
                                   numMethod="4"
                                   name="IMyInterface3"
                                   proxyStubClsid32="{proxyStubClsid32}"
                                   />
</assembly>

在这种情况下,{proxyStubClsid32}是已注册的代理/存根 CLSID。


如果我没记错的话,当 Windows XP 仍然受支持时,我已经成功尝试过使用comInterfaceExternalProxyStub对于代理/存根 DLL 中的接口,然后声明相应的comClass代理/存根中的元素file元素,实际上不需要comInterfaceProxyStub元素。

然而,这不是一个好的做法,comInterfaceExternalProxyStub实际上应该仅用于外部代理/存根,正如其记录的方式一样,听起来好像允许 COM 基础结构在激活所需的代理/存根时不在隔离的 CLSID 中查找。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过准隔离COM使用EXE服务器 的相关文章

  • C# - 编写 COM 服务器 - 映射到方法的属性

    我们正在尝试替换最初为 VB6 应用程序编写的 COM 服务器 我们无法访问源代码 由于某种原因 VB6 应用程序可以调用我们的构造函数 但随后它会得到 系统错误 H80004002 没有这样的 接口支持 我假设当它尝试使用 QueryIn
  • 应用程序之间的通信

    我有 3 个选择可以使用 套接字 activeX com 以便在一台计算机上的应用程序之间进行通信 哪个更快 只要它在一台机器上运行 进程间通信从根本上就会受到总线带宽的限制 内存到内存的复制 无论是在 TCP IP 堆栈 命名管道支持代码
  • 访问 MS Access 应用程序中的原始代码

    我一直在尝试查找一些有关访问 MS Access 中的原始代码的信息 我使用 v2007 但可能应该适用于所有版本 举例来说 我想列出应用程序中每个代码隐藏表单和模块中的所有函数并列出它们的参数 你将如何实现这一目标 注意 我当然假设该应用
  • 将事件分配给事件处理程序的两种不同类型之间的区别

    我在 SO 中看到了这个示例代码 它说一种做法不好 另一种做法很好 但我不明白为什么 事实上 我收到了著名的 RCW COM 对象错误 该帖子说这可能是一个原因 public class SomeClass private Interop
  • 将 .NET 事件公开给 COM?

    我一直在尝试向 VBA 客户端公开并触发事件 到目前为止 在 VBA 客户端 事件已公开 并且我看到方法事件处理方法已添加到我的模块类中 但是 VBA 事件处理方法不会触发 由于某种原因 调试时事件为空 同步修改我的代码也没有帮助 作为记录
  • 在 64 位 Windows 计算机上使用 32 位 com 运行 32 位应用程序

    我有一个使用 C COM 对象的 C 应用程序 两者都构建在 32 位计算机上 现在我必须在 64 位机器上运行它们 我注册了COM对象 在计算机 hkey classes root wow6432node clsid xxx 下的寄存器中
  • 从单线程进行 COM 调用会挂起线程

    我有一个应用程序 可以通过自动化插件执行一些 Excel 自动化操作 该加载项是多线程的 所有线程都设法调用 Excel COM 对象 由于 Excel 在进行多次调用时有时会返回 忙 异常 因此我将所有调用包装在 重试 函数中 但我觉得这
  • AxInterop 和 Interop 有什么区别?

    我已将 ocx 添加到 VS 的工具箱中 创建了两个 dll Interop NNN dll AxInterop NNN dll 每一个是什么 两者都需要吗 Interop xxx dll 和 AxInterop xxx dll 分别是引用
  • 如何从 C# 等托管代码中使用 ActiveX 组件的嵌入式免注册清单?

    我想使用未在系统或用户范围内注册的特定版本的 ActiveX 组件 如果我使用清单文件 一切都会按预期工作 但是 嵌入式清单仅适用于 C 客户端代码 这是依赖声明
  • 允许连接到完整性级别不匹配的 .NET COM 服务器

    我在基于 COM 的客户端 服务器设置方面遇到问题 COM 服务器是用 C NET 4 0 编写的 并作为 注册的 本地服务器运行 根据连接到服务器的应用程序 其他客户端将收到服务器执行失败 HRESULT 异常 0x80080005 CO
  • C# 中 System.String[*] 和 System.String[] 的区别

    Edit 我知道 C 相当于For Each server As String In servers is foreach var item in servers 但是由于GetOPCServers返回对象 应该将其转换为可迭代类型 我正在
  • .NET 中的 CoCreateInstance 完全匹配吗?

    我有进程内 DLL COM 服务器 但我选择以 DllSurrogate 身份运行 因此从非托管代码 Delphi 中我有 function TComWrapper GetServer IUnknown begin OleCheck CoC
  • 调用 Word.Documents.Add 后 WinWord.exe 不会退出 - Word .NET Interop

    我遇到了一个经典场景 即在 NET 中创建 Word COM 对象 通过 Microsoft Office Interop Word 程序集 时 WinWord 进程不会退出 即使我正确关闭和释放物体 http www xtremevbta
  • Java、Jacob 和 Microsoft Outlook 事件:收到“找不到事件 iid”错误

    我正在编写一个 Java 程序 它使用雅各布图书馆 http danadler com jacob 桥接 COM 和 Java 该程序创建了一个新的MailItem http msdn microsoft com en us library
  • 如何将 char * 转换为 BSTR?

    如何将 char 从 C dll 传递到 VB 这是示例代码 void Cfunc char buffer int len BSTR buf bstr SysAllocString BSTR buffer VBptr VBfunc buf
  • VBA COM 库中的这些 _B_var_Xxxxx 和 _B_str_Xxxxx 成员到底是什么?

    想象一下以下函数调用 foo UCase bar 我正在解析这段代码 并确定UCase是一个函数调用 现在我想将该函数调用解析为定义它的 COM 库中函数的声明 这个想法是实现一个代码检查来确定何时Variant当使用内置函数时String
  • C# - 检索 COM+ 组件的属性?

    我的服务器 Windows Server 2003 上有一个 COM 组件 有什么方法可以以编程方式检索该组件的属性 例如使用的构造函数字符串 当我转到管理工具 gt 组件服务 gt COM 应用程序并右键单击我的组件时 这些是我希望能够检
  • 创建仅包含枚举的 COM 库时出现问题

    我正在做一个 COM 互操作项目 用 C 和 NET Interop 替代一些 VB 和 C ATL COM 项目 当我在 NET 中定义枚举并将它们设为 ComVisible 时 它 们会公开为 Typelib EnumType Enum
  • 如何正确使用和实例化现有预览处理程序

    我正在尝试使用现有的预览处理程序来显示文件的预览 我编写了一个简单的测试程序 以 1 查找给定文件的预览处理程序的 CLSID 2 实例化预览处理程序 3 通过流或文件初始化它 4 在基本窗口上渲染预览 这有效 或多或少 It works
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo

随机推荐