原文作者:Alex Blekhman
翻译:朱金灿
原文来源:
http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx
译文来源:http://blog.csdn.net/clever101
C++语言毕竟能和Windows DLLs能够和平共处。
介绍
自从Windows的开始阶段动态链接库(DLL)就是Windows平台的一个组成部分。动态链接库允许在一个独立的模块中封装一系列的功能函数然后以一个显式的C函数列表提供外部使用者使用。在上个世纪80年代,当Windows DLLs面世时,对于广大开发者而言只有C语言是切实可行的开发手段。所以, Windows DLLs很自然地以C函数和数据的形式向外部暴露功能。从本质来说,一个DLL可以由任何语言实现,但是为了使DLL用于其它的语言和环境之下,一个DLL接口必须后退到最低要求的母体——C语言。
使用C接口并不自动意味一个开发者应该应该放弃面向对象的开发方式。甚至C接口也能用于真正的面向对象编程,尽管它有可能被认为是一种单调乏味的实现方式。很显然世界上使用人数排第二的编程语言是C++,但它却不得不被DLL所诱惑。然而,和C语言相反,在调用者和被调用者之间的二进制接口被很好的定义并被广泛接受,但是在C++的世界里却没有可识别的应用程序二进制接口。实际上,由一个C++编译器产生的二进制代码并不能被其它C++编译器兼容。再者,在同一个编译器但不同版本的二进制代码也是互不兼容的。所有这些导致从一个DLL中一个C++类简直就是一个冒险。
这篇文章就是演示几种从一个DLL模块中导出C++类的方法。源码演示了导出虚构的Xyz对象的不同技巧。Xyz对象非常简单,只有一个函数:Foo。
下面是Xyz对象的图解:
Xyz
int Foo(int)
Xyz对象在一个DLL里实现,这个DLL能作为一个分布式系统供范围很广的客户端使用。一个用户能以下面三种方式调用Xyz的功能:
- 使用纯C
- 使用一个规则的C++类
- 使用一个抽象的C++接口
源码(译注:文章附带的源码)包含两个工程:
- XyzLibrary – 一个DLL工程
- XyzExecutable – 一个Win32 使用"XyzLibrary.dll"的控制台程序
XyzLibrary工程使用下列方便的宏导出它的代码:
- #if defined(XYZLIBRARY_EXPORT) // inside DLL
- # define XYZAPI __declspec(dllexport)
- #else // outside DLL
- # define XYZAPI __declspec(dllimport)
- #endif // XYZLIBRARY_EXPORT
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)