在 C++Builder 工程里使用 Visual C++ DLL——第2部分:C++ 类 shadowstar's home: http://shadowstar.126.com/ source:http://www.bcbdev.com/articles/vcdll2.htm 注意:这篇文章描述如何把 C++ 类从 Visual C++ DLL 引入到 BCB 的工程中。在我们开始之前,我觉得必须给出一点警告。这篇文章不是真的准备大量发布的。如果“文章”跌宕起伏,难以阅读,或包含错误,我道赚!我没有时间去改良它。我决定继续并发布的唯一原因是因为很多开发者问到怎么处理这个问题。我认为,一篇写的很烂的文章总比什么都没有好。我希望这个不连贯概念的搜集品会给你带来帮助。 在上一篇文章如何“在 C++Builder 工程里使用 Visual C++ DLL”中,我描述了如何为 MSVC DLL 创建一个 Borland 兼容的引入库。主要的难点在于 MSVC 和 Borland 使用的函数命名格式不同。举例来说,Borland 认为 __cdecl 函数在它们的开头有一个下划线,但 MSVC 没有。幸运的是,你可以用 Borland 命令行实用工具克服名称的不同,这些工具有 TDUMP、IMPLIB、IMPDEF、和 COFF2OMF。方法是用这些命令行工具创建一个带有 Borland 兼容函数名的 Borland 兼容引入库。一旦你拥有了 Borland 兼容引入库,你便可以开始工作了。你可以简单的连接引入库来使用 MSVC DLL。 不幸地,这种策略不能完全带你走出这片森林。在上一篇 DLL 文章的结尾,我丢下了一个小炸弹。你只能调用 MSVC DLL 里简单的 C 函数,而不能引入类或类成员函数。Doh! 那么如果你需要从 MSVC DLL 引入 C++ 类要做些什么呢?啊……这个,如果是那样的话,你就被关到角落里了,没有多少可选择的余地(通常在你退到角落里的时候,你的选项都不是令人满意的)。这篇文描述了三种可以带你走出角落的方法。 坏消息:当你准备花点时间研究这篇垃圾的时候,我觉得,再次,被迫发出警告。所有三种技术需要你有 Microsoft Visual C++。你不需要有要调用的 DLL 的源代码,但你需要有可以调它的工具。三种技术都或多或少使用包装技术,我们用 MSVC 把 DLL 包装成可以在 BCB 里使用的某种形式。 三种技术摘要 技术 1: 把 C++ 类包裹到 C 库里 技术 2: 创建 COM 包装 技术 3: 使用带虚函数的抽象基类(pseudo-COM) 结论 下载 三种技术摘要 Ok, 现丑了。这就是那三种技术。 用 MSVC 创建一个 DLL,把 C++ 类包裹成简单的 C 函数。简单的 C 函数是可以在 BCB 里引入的。 用 MSVC 创建一个 COM 对象,把 C++ 类经过限制包装。BCB 可以作为 COM 客户端来调用 VC++ COM 对象。 把 C++ 类用抽象类包装起来,这个抽象类只带有一些没有实体的虚函数。这从本质上说还是 COM,只是没有了难看的部分。 下面描述各种技术的更多详细内容。在每一个例子中,我们将假定 MSVC DLL 导出的类形式如下:class CFoo { public: CFoo(int x); ~CFoo(); int DoSomething(int y); }; 技术 1: 把 C++ 类包裹到 C 库里 在前一篇有关 VC++ DLL 的文章里,我们知道在一个 Borland 工程里调用从一个 MSVC DLL 导出的简单的 C 函数是可能的。利用这条信息可知,我们可以在 MSVC 里创建一个 DLL 工程,来导出