用VC++创建可重用的Dll

1.在VS中创建名为选择模版”Win32 Project” ,创建一个名为”Math”的项目:

1

2.在向导中,选择程序类型为”Dll”,附加选项为”Empty project”:

2

3.由于选择的是空项目,所以解决方案管理器中现在还没有任何代码文件。

4.手动添加两个文件:Math.h和Math.cpp,其中包含了一个一个类Math,一个全局函数Multiply()和一个全局变量GlobalVariable:

   1: //Math.h
   2: #pragma once
   3: class Math
   4: {
   5: public:
   6:     Math(void);
   7:     ~Math(void);
   8:  
   9: public:
  10:     int Add(int a,int b);
  11: };
  12:  
  13: int Multiply(int a,int b);
  14:  
  15: extern int GlobalVariable;
   1: //Math.cpp
   2: #include "Math.h"
   3:  
   4: Math::Math(void){}
   5: Math::~Math(void){}
   6: int Math::Add(int a, int b)
   7: {
   8:     return a+b;
   9: }
  10:  
  11: int Multiply(int a,int b)
  12: {
  13:     return a*b;
  14: }
  15:  
  16: int GlobalVariable = 101;

 

5.打开Math项目的属性对话框,注意,在Configuration Properties—>C/C++—> Preprocessor—> Preprocessor Definitions中已经定义了一个预处理符号:MATH_EXPORTS

3

6. 编译此项目,将在解决方案的Debug目录下生成一个Math.dll文件,但这个动态链接库是无法直接使用的。如果其他项目想要使用此dll,还需要导出一个lib文件。

7.在Math.h中添加几行预处理指令(用到了项目属性中已定义好的MATH_EXPORTS),并在每个需要导出的类,函数和全局变量前面加上导出标记MATH_API。修改后的Math.h为:

   1: //Math.h
   2: #pragma once
   3:  
   4: #ifdef MATH_EXPORTS
   5: #define MATH_API __declspec(dllexport)
   6: #else
   7: #define MATH_API __declspec(dllimport)
   8: #endif
   9:  
  10: class MATH_API Math
  11: {
  12: public:
  13:     Math(void);
  14:     ~Math(void);
  15:  
  16: public:
  17:     int Add(int a,int b);
  18: };
  19:  
  20: int MATH_API Multiply(int a,int b);
  21:  
  22: extern MATH_API int GlobalVariable;

8.重新编译Math项目,会在解决方案的Debug目录下生成一个Math.lib和一个Math.dll,以及其他几个调试辅助文件。其他项目想要调用Math.dll,只需要添加Math.h头文件,然后链接Math.lib即可。

9.新建一个名为MathTest的Win32控制台项目作为Math.dll的测试程序。

10.添加头文件Math.h,导入Math.lib:

   1: //MathTest.cpp
   2:  
   3: #include "../Math/Math.h"
   4: #pragma comment(lib,"../Debug/Math.lib")

11.测试Math.dll中所导出的类Math,函数Multiply()和全局变量GlobalVariable:

   1: //MathTest.cpp
   2:  
   3: Math math;
   4: cout<<"33+44= "<<math.Add(33,44)<<endl;
   5: cout<<"20*50= "<<Multiply(20,50)<<endl;
   6: cout<<"GlobalVariable= "<<GlobalVariable<<endl;

posted on 2009-07-06 00:40  wudong  阅读(796)  评论(0编辑  收藏  举报

导航