Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1067058
  • 博文数量: 264
  • 博客积分: 6005
  • 博客等级: 大校
  • 技术积分: 2798
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 20:15
文章分类

全部博文(264)

文章存档

2011年(42)

2010年(213)

2009年(4)

2008年(2)

2007年(3)

分类: C/C++

2011-06-22 11:21:33

如何在VC中导出类,这是一个常有人问起的问题,下面我以一个简单的例子来说明这个问题:

首先使用Wizard创建一个Win32 Dynamic-Link Library工程,然后定义一个简单的C++类CInDLL。由于该类会被工程之外的文件所引用,所以需要对这个类进行引出。因为只有引出后所生成的 DLL中才带有供足够的信息以在连接和运行时被正确引入到进程空间中。有两种方法可以引出类,使用__declspec(dllexport)定义和使用 定义文件。

下面先讲使用__declspec(dllexport)的方法:将类定义改为:class __declspec(dllexport) CInDLL 就可以了。(译者:你也许不相信会有这么简单,我也不相信。:-) 这样产生的工程在编译时是正确的但是在使用时会产生错误,因为你包含的头文件中也是使用__declspec(dllexport),而使用这个DLL的 工程中并没有引出这个类,而是需要引入这个类)在使用时需要将类定义改为class __declspec(dllimport) CInDLL就可以了。

使用定义文件可以有效的避免这个问题,这种方法是利用宏定义在不同的地方产生不同的编译代码:在头文件中加入如下的代码:


  1. #ifdef _CLASSINDLL
  2.    #define CLASSINDLL_CLASS_DECL __declspec(dllexport)
  3. #else
  4.    #define CLASSINDLL_CLASS_DECL __declspec(dllimport)
  5. #endif

  6. #endif // ClassInDLL_H
  7. //将class __declspec(dllexport) CInDLL改为
  8. class CLASSINDLL_CLASS_DECL CInDLL
  9. {
  10.     CInDLL();
  11. ...
  12. }

  13. 在实现这个类的CPP文件的顶部加入#define _CLASSINDLL语句。

  14. #define _CLASSINDLL
  15. CInDLL::CInDLL()
  16. {
  17. }
  18. ...

这样一来在使用这个类时就可以不做任何改动了。

(译者:这中方法在没有使用MFC时可以使用,如果你使用MFC生成MFC DLL那么只要做如下定义就可以了class AFX_EXT_CLASS yourClass)

阅读(1027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~