Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ COM客户端连接COM服务器(进程外场景)需要哪些文件?_C++_Com_Msdn_Idispatch_Iunknown - Fatal编程技术网

C++ COM客户端连接COM服务器(进程外场景)需要哪些文件?

C++ COM客户端连接COM服务器(进程外场景)需要哪些文件?,c++,com,msdn,idispatch,iunknown,C++,Com,Msdn,Idispatch,Iunknown,我想了解本文中提到的文件的用途,并将这些知识链接到我当前的COM服务器和COM客户端场景,以便我可以实现我的COM服务器来使用COM服务器: 我有一个COM服务器,它是一个在后台运行的exe或服务。现在,我知道有一个从IUnknown和IDispatch继承的公开接口。此外,我还生成了以下文件: xxx_i.c定义了所有CLSID和IID xxx_i.h定义了接口支持的所有方法 xxx\U p.c dlldata.c 我现在使用自动化方式IDispatch->Invoke()来访问接口方法。虽然

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

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

  • xxx_i.c定义了所有CLSID和IID

  • xxx_i.h定义了接口支持的所有方法

  • xxx\U p.c

  • dlldata.c

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


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

    StackOverflow无法提供阅读材料的请求,但我不得不重新提交这本开创性的著作,该著作已经出版,可以在其他地方作为电子书提供。以下是唐对该主题的描述:

    盒子,唐。基本的COM。Addison-Wesley,1998年,第350页:

    COM基于客户机程序,该客户机程序对 接口在开发时的定义。这已经完成了 要么通过C++头文件(C++客户端)或通过 库(用于Java和Visual Basic客户端)。一般来说,这是不正确的 这是一个问题,因为用这些语言编写的程序通常会遇到 部署之前的某种编译阶段。一些语言 在开发时不要经历这样的编译阶段 而是以源代码形式部署,以便在运行时进行解释

    也许这些语言中最普遍的是基于HTML的脚本 在中执行的语言(例如,Visual Basic脚本、JavaScript) Web浏览器或Web服务器的上下文。在这两方面 在某些情况下,脚本文本以原始形式存储在HTML文件中, 而周围的运行时会动态执行脚本文本作为 HTML被解析。为了提供丰富的编程环境,这些 环境允许脚本调用COM对象上的方法,这些方法可能会 可以在脚本文本本身中创建,也可以在HTML的其他地方创建 流(例如,也是网页一部分的控件)。在这些 在环境中,目前无法使用类型库或 为运行时引擎提供描述的其他先验方法 正在使用的接口的名称。这意味着对象本身 必须协助译员将原始脚本文本翻译成 有意义的方法调用

    允许从中使用对象的步骤 解释性环境,如Visual Basic脚本和JavaScript, COM定义了一个表示 口译


    Tl;dr:有两种方法可以在COM中执行所有操作(忽略
    IInspectable
    和双接口):

  • IUnknown

    标准虚拟方法调用。快速,无需额外代码。需要客户端调用上的编译时接口信息(.h或.tlb)
  • IDispatch

    “后期绑定”。速度慢,有很多解释代码。不需要客户端编译或接口规范

  • 实际上,除非您是从VBA、VBScript或有一些旧的VB6客户端调用,否则最好只使用
    IUnknown

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

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

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

    然后,在
    IUnknown
    的基础上,微软创建了一个名为
    IDispatch
    的通用接口(这也被称为“自动化”,或“后期绑定”,而不是
    IUnknown
    的“早期绑定”),当时的目标是VB/VBA客户端(甚至在VBScript、JScript和许多其他COM客户端之前,.NET都支持IUnknown和IDispatch)。
    IDispatch
    ,如果你这样做的话,可能是你必须实现的最后一个接口,因为它的语义允许完全发现和调用任何方法,只要它支持一组有限的定义数据类型“自动化类型”:BSTR、变体等

    因此,如果您支持
    IDispatch
    ,请提供TLB(typelibs)并限制所有类型