首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有哪些简单的方法可以用COM接口包装基于c++的对象模型

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

Stack Overflow用户
提问于 2010-04-08 21:23:44
回答 2查看 1.3K关注 0票数 6

我有一个预先存在的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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-04 00:23:20

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

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

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

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

但我决定回答你,因为我想建议选择另一种现代的方式。COM技术非常古老。NET拥有内部的所有功能,并将永久开发。所以我发现来自的一种方法最有趣。将COM完全写在C#中,将COM对象的开发分为两部分:

  1. 您只编写接口没有任何实现的程序集并注册它。
  2. 您开发实现此COM接口的.NET类。

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

在评论之后更新了:对不起,您正在寻找一种简单的方法来解决一个复杂的问题。这是不可能的。

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

例如,如果有人继承了您的类,而您后来更改了一些私有成员,则会对所有继承的类产生影响。使用C++对象的完整代码必须重新编译,至少因为sizeof(object)已经更改。COM中不存在这样的问题,因为所有使用您的对象的人都不会继承您的对象类。一种是通过接口使用对象,在修改基类的一些私有成员后,签名和sizeof()不会改变。你可以在网上读到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 ),则将创建一个新进程。如果有人调用了你的对象的一个方法,那么所有参数的封送处理就会完成。参数的封送处理意味着在另一个线程中分配内存,并将所有参数复制到该线程。我之前描述的所有这些东西都不是C++对象的术语。我写这篇文章只是为了澄清COM实际上与C++对象模型不同。

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

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

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

很抱歉回答得太长了。

票数 6
EN

Stack Overflow用户

发布于 2010-04-08 21:28:28

http://www.lambdasoft.dk/Comet/index.htm

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

的替代品

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2600136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档