gpt4 book ai didi

c++ - 有哪些简单的方法可以用 COM 接口(interface)包装基于 C++ 的对象模型

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:04 32 4
gpt4 key购买 nike

我有一个预先存在的 c++ 对象模型,它表示应用程序的业务层层。我希望能够将对象模型暴露给用其他语言编写的应用程序,即 vbscript、VB、javascript 等。我相信这样做的最好方法是用 COM 层包装业务对象。

有什么快速有效的方法可以做到这一点。任何建议,实用的“如何”文档的链接将不胜感激。

因为我正在为此开始赏金,这里有一些针对潜在赏金猎人的额外指南:-
1)我决定采用 ATL 方法
2)我现在正在专门寻找有关包装预先存在的 c++ 对象模型的非常好的“如何和快速”文档的链接,以使其可用于诸如 javascript 之类的脚本语言
3)一些带有小的工作示例的东西向我展示了哪些代码需要添加到哪些文件中,例如进入 cpp 、 idl 和 hpp/h 等的内容。它必须包含一个示例,我可以编译测试和更改以获得更好的理解.

附录.....
进一步的上下文。对我来说,这是大约 10 年后重新访问 COM。我在 2000 年之前的 3 年里做了 MFC 和 ATL COM。我了解 COM 是什么,用于在 C++ 中实现它的原则,线程模型等。任何“如何和快速”的文档都不会盲目地引导我重要的原则,更多的是指导性的再学习体验。

如果我有更多时间,我会深入研究 Troelsen 的“COM 和 ATL 3.0 的开发人员研讨会”,这是一本非常好的书,但它的启动(重新)启动非常缓慢。

评论后的进一步上下文......

保持尽可能简单,单线程单元模型和进程内 dll。

最佳答案

我在 http://www.codeproject.com/KB/COM/index.aspx?#COM/DCOM/COM+%20-%20Beginners 中找到了一个很好的初学者文章集。 .这是:

http://www.codeproject.com/KB/COM/hellocom.aspx , http://www.codeproject.com/KB/COM/comintro2.aspx ,
http://www.codeproject.com/KB/COM/comintro.aspx , http://www.codeproject.com/KB/COM/com_server_without_mfc_atl.aspx , http://www.codeproject.com/KB/COM/com_in_c1.aspx

但是,如果您开始编写 COM 对象,那么了解 COM 的线程模型非常重要。这在这里解释得很好

http://www.codeproject.com/KB/COM/CCOMThread.aspx , http://www.codeproject.com/KB/COM/CCOMThread2.aspx

但我决定回答你,因为我想建议选择其他一些现代方式。 COM 技术非常古老。 Dot NET 具有所有内部功能,并将永久开发。所以我找到了来自 Building COM Servers in .NET 的方法最有趣的。用 C# 编写完整的 COM 将 COM 对象的开发分为两部分:

  • 你写 仅接口(interface) 没有任何实现的程序集并注册它。
  • 您开发了一个实现此 COM 接口(interface)的 .NET 类。

  • 您可以在 http://www.codeproject.com/KB/COM/COMinDotNet.aspx 中查看更简单的版本。 , http://www.codeproject.com/KB/cs/CreateActiveXDotNet.aspx , http://msdn.microsoft.com/en-us/library/ms973807.aspx ,但我建议您使用 http://www.codeproject.com/KB/COM/BuildCOMServersInDotNet.aspx 中描述的“在 .NET 中构建 COM 服务器”的方式.

    评论后更新 : 抱歉,您正在寻找解决复杂问题的简单方法。是不可能的。

    理解这一点非常重要,尽管有相似之处,但面向对象的 C++ 和 COM 之间仍然存在许多主要差异。重要的是要了解 COM 不是面向对象的语言 但是一个二进制协议(protocol)。软件组件(COM 对象)是 可重用代码的二进制单元 .它解决了基于面向对象方法设计的程序模块单独编译存在的许多问题。

    例如,如果有人继承了您的类,而您稍后更改了一些私有(private)成员,则会对所有继承的类产生影响。完整代码使用了您的 C++ 对象 必须重新编译 至少因为 sizeof(object)已经变了。这样的问题在 COM 中不存在,因为所有使用你的对象的人都不会继承你的对象类。一个人通过 使用您的元素接口(interface) ,其中签名和 sizeof()修改基类的一些私有(private)成员后不会改变。你可以在线阅读Don Box经典著作《Essential COM》第一章中的一些非常好的例子: http://books.google.co.uk/books?id=kfRWvKSePmAC&dq=essential+com&printsec=frontcover&source=bn&hl=en&sa=X&oi=book_result&resnum=6&ct=result .我也推荐你阅读一篇小文章 http://edndoc.esri.com/arcobjects/9.0/ArcGISDevHelp/DevelopmentEnvs/COM/IntroToCOM.htm了解 COM 和 C++ 对象之间的更多差异。

    如果您将 C++ 对象重写为 COM 对象,您必须选择线程模型,您必须了解如何编写线程安全程序或者您必须使用单线程单元模型。您的所有对象都将存在(分配和运行)在一个单独的线程中。如果您选择进程外 COM 对象(将创建包含所有对象的 exe),则将创建一个新进程。如果有人调用您的对象的方法,则将完成所有参数的编码(marshal)处理。参数的编码意味着在另一个线程中分配内存并将所有参数复制到该线程。
    我之前描述的所有这些东西都不是 C++ 对象的术语。我写这个只是为了清楚 COM 确实与 C++ 对象模型不同。

    因此,要包装现有的 C++ 对象,您必须定义一些纯虚拟类——您在对象中实现的接口(interface)。此接口(interface)必须以 IDL/MIDL(Microsoft 接口(interface)定义语言)编写。这是最重要的!然后,您必须使用现有的 C++ 类将这些接口(interface)实现为 COM 协类。

    我敢肯定,如果您在 .NET 中完成这些工作,您就不需要研究 COM 开发人员通常需要了解的大量实现细节。您只需在 C#/C++(纯虚拟​​类)中定义一个接口(interface)并编译它。您可以为 Visual Studio 内的强签名程序集生成私钥。只需进入“签名”部分的项目设置并选择“签署程序集”,然后选择“新建”强名称 key 文件。这就是全部。通过这种方式,您可以完全定义一个 COM 接口(interface)。将为您生成一个 MIDL 版本的界面。

    然后你在 C# 或 C++ 中创建一个新项目并声明继承你之前定义的接口(interface)的类。在实现此接口(interface)期间,您可以使用整个现有的 C++ 对象。因此,您将能够快速丰富您的目标。只需按照 http://www.codeproject.com/KB/COM/BuildCOMServersInDotNet.aspx中详细描述的方式操作即可. 通过这种方式,您将不必学习在 C++ 中使用经典 COM 实现必须了解的大量技术细节 .您将学习现代 .NET,而不是学习旧的和事实上已死(或未进一步开发)的 COM。

    对不起,答案很长。

    关于c++ - 有哪些简单的方法可以用 COM 接口(interface)包装基于 C++ 的对象模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2600136/

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