gpt4 book ai didi

c++ - COM 客户端连接 COM 服务器(进程外场景)所需的文件是什么?

转载 作者:行者123 更新时间:2023-11-28 04:18:59 28 4
gpt4 key购买 nike

我想了解本文中提到的文件的用途,并将这些知识链接到我目前的COM服务器和COM客户端场景,以便我可以实现我的COM服务器来使用COM服务器:this

我有一个 COM 服务器,它是一个在后台运行的 exe 或服务。现在,我知道有一个公开的接口(interface)继承自 IUnknown 和 IDispatch。此外,我还生成了以下文件:

  1. xxx_i.c 定义了所有的 CLSID 和 IID

  2. xxx_i.h定义接口(interface)支持的所有方法

  3. xxx_p.c ?

  4. dlldata.c ?

我现在使用自动化方式 IDispatch -> Invoke() 来访问接口(interface)方法。尽管这种方式在不使用上述任何文件的情况下似乎工作正常,但我仍然想在使用正常方式 IUnknown -> QueryInterface() 访问这些方法时了解它们的用途。

由于我是 COM 世界的新手,任何建议的阅读都将不胜感激!谢谢!

最佳答案

在最简单的形式中,COM 只是 vtable 二进制契约加上所有接口(interface)之母:IUnknown。 COM 是一种在没有源代码的情况下重用代码的方法,使用组件,它是某种动态转换机制。如果我知道你支持的组件类(它们的CLSID),它们公开的接口(interface)(它们的IID),以及这些接口(interface)的方法布局是什么,它们的参数,顺序,类型等,我可以使用你的 COM 服务器。

但是为了简化 COM 客户端和 COM 服务器之间的“通信”,您可以/应该使用一些标准机制/文档并添加工具,以便无需任何努力就可以处理诸如编码(marshal)处理(=序列化)之类的管道问题。这在进程外的情况下至关重要,而在进程内则不太重要(我将在这里避开“公寓”概念......)

因此,您会在 COM 中找到很多东西(例如注册、工具、IDL、类型库等)实际上是可选的,但也非常有用(因此它们最终有点变成强制性的)。 idl(“接口(interface)语言定义”)之类的目的是定义并向您的 COM 客户端公开您的 COM 服务器支持的内容,以便工具可以为您和您的客户端自动生成大量代码( .c、.h、.tlb)。请注意,没有什么可以阻止您在不在 idl 中定义接口(interface)或组件类的情况下实现它们。没有任何义务要求您提供 .idl 或 .tlb。在这种情况下,只有知道它们的 IID、方法布局等,我才能使用它们。

然后,在 IUnknown 之上,Microsoft 创建了一个名为 IDispatch 的通用接口(interface)(这也称为“自动化”或“后期绑定(bind)”,而不是“IUnknown 的早期绑定(bind)”,当时针对 VB/VBA 客户端(甚至在 VBScript、JScript 和许多其他 COM 客户端之前,.NET 支持 IUnknown 和 IDispatch)。 IDispatch,如果你走那条路,可能是你必须实现的最后一个接口(interface),因为它的语义允许完全发现和调用任何方法,前提是它支持一组有限的已定义数据类型,“自动化类型”:BSTR、VARIANT 等。

因此,如果您支持 IDispatch,提供 TLB(类型库)并将所有类型限制为自动化类型,那么您就不需要处理编码(marshal)处理,不需要代理和 stub ,您可以忘记这一切,即使是在进程外的情况下,因为 Microsoft 会自动实现。过去,我们称“oleaut32.dll”为“通用编码(marshal)拆收器”。

双接口(interface)是同时支持IUnknown 和派生类以及IDispatch 的接口(interface)。它们的存在主要是为了同时支持 C/C++ 客户端 自动化客户端。在 C/C++ 中使用自动化(BSTR、VARIANT 等)有点痛苦,因为它们最初并不打算由 C/C++ 客户端使用...注意 Microsoft 提出了 C++ 智能包装类:CComBSTRCComVARIANT 与 ATL,或 _variant_t_bstr_t 与 Windows SDK。

关于c++ - COM 客户端连接 COM 服务器(进程外场景)所需的文件是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55892813/

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