有什么简单的方法来包装c++;基于COM接口的对象模型 我有一个预先存在的C++对象模型,它代表应用程序的业务层层。我希望能够将对象模型公开给用其他语言编写的应用程序,如vbscript、VB、javascript等。我认为最好的方法是用COM层包装业务对象

有什么简单的方法来包装c++;基于COM接口的对象模型 我有一个预先存在的C++对象模型,它代表应用程序的业务层层。我希望能够将对象模型公开给用其他语言编写的应用程序,如vbscript、VB、javascript等。我认为最好的方法是用COM层包装业务对象,c++,com,atlcom,C++,Com,Atlcom,有什么快速有效的方法可以做到这一点。如果您有任何建议,请联系实际的“如何”文档,我们将不胜感激 因为我要开始悬赏,这里有一些额外的指导方针给潜在的悬赏猎人:- 1) 我已经决定采用ATL方法 2)我现在特别寻找链接,以很好的“如何快速地”包装一个预先存在的C++对象模型,使它可以像JavaScript这样的脚本语言使用。 3) 一些小的工作示例向我展示了哪些代码需要添加到哪些文件中,例如cpp、idl和hpp/h等。它必须包括一个示例,我可以编译测试和更改以更好地理解 附录。。。。。 进一步的背

有什么快速有效的方法可以做到这一点。如果您有任何建议,请联系实际的“如何”文档,我们将不胜感激

因为我要开始悬赏,这里有一些额外的指导方针给潜在的悬赏猎人:- 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。

彗星是COM与C++之间的语言绑定。它允许您同时进行COM客户端和COM服务器编程,而不依赖于ATL或MFC。换句话说,Comet是ATL的替代品


我发现了一本适合初学者阅读的好文章集。这是:

,, ,

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

,

但我决定回答你们,因为我想建议你们选择一种现代的方式。COM技术非常古老。dotnet拥有内部的所有功能,并将永久开发。所以我找到了一个最有趣的方法。您可以用C语言编写完整的COM,将COM对象的开发分为两部分:

  • 您只编写接口程序集,不使用任何实现并注册它
  • 您将开发一个实现此COM接口的.NET类
  • 您可以在中查看更简单的版本,但我建议您使用中所述的“在.NET中构建COM服务器”的方法

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

    <> P.C.C++和COM之间存在着许多主要的区别,但这是非常重要的。重要的是要理解,COM不是一种面向对象的语言,而是一种二进制协议。软件组件(COM对象)是可重用代码的二进制单元。它解决了基于面向对象方法设计的程序模块单独编译中存在的诸多问题

    例如,如果有人继承了您的类,而您后来更改了一些私有成员,则会对所有继承的类产生影响。您的C++对象<强>的完整代码必须重新编译,至少是因为<代码> sieOf(对象)< /C>已更改。COM中不存在这样的问题,因为所有使用对象的人都不会继承对象类。您可以通过接口使用对象,修改基类的某些私有成员后,签名和
    sizeof()
    将不会更改。你可以在线阅读Don Box的经典著作《Essential COM》第一章中的一些非常好的例子。我建议您也阅读一篇小文章,了解COM和C++对象之间的更多差异。 <>如果你把C++对象重写为COM对象,你必须选择线程模型,你必须了解如何编写线程安全的程序,或者你必须使用单线程的公寓模型。您的所有对象都将存在(分配并运行)在一个单独的线程中。如果选择进程外COM对象(将创建包含所有对象的exe),则将创建一个新进程。如果有人调用对象的方法,则会对所有参数进行封送处理。参数封送意味着在另一个线程中分配内存,并将所有参数复制到该线程。 我之前所描述的这些东西都不是C++对象的术语。我写这个只是为了清楚COM真的和C++对象模型不一样。 <席>要包装现有的C++对象,必须定义一些纯虚拟类——在对象中实现的接口。此接口必须以IDL/MIDL(Microsoft接口定义语言)编写。这是最重要的事情!然后,必须使用现有C++类将COM类实现为这些接口。

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