vs2010创建和使用动态链接库(dll)
——某一天,我突然发现身边的女生烦我了,于是,我决定开始写程序……
本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并提出了与实现相关的几个问题,供初学者交流。
本文包含以下内容:
创建动态链接库项目
向动态链接库添加类
创建引用动态链接库的应用程序
在控制台应用程序中使用类库的功能
更丰富的simpledll类和相关问题
参考资料
创建动态链接库项目:
1、打开Microsoft Visual Studio 2010,选择File->New->Project。
2、在New Project中选择Installed Templates->Visual C++->Win32。
3、选择Win32 Console Application,设置名称:simpledll,设置解决方案名:zdddll。
4、单击OK,在出现的Win32 Application Wizard的Overview对话框中点击Next。
5、在Application Settings中,选择Application type下的DLL。
6、勾选Additional options下的Empty project。
7、单击Finish创建项目。
向动态链接库添加类:
1、添加新类头文件。右键单击simpledll项目,Add->New Item,选择Header File(.h),设置名称为simpledll,单击Add。
2、添加新类源文件。右键单击simpledll项目,Add->New Item,选择C++ File(.cpp),设置名称为simpledll,单击Add。
3、为新类添加内容。内容如下:
头文件simpledll.h:
//------------------ simpledll.h ---------------- #pragma once; //该宏完成在dll项目内部使用__declspec(dllexport)导出 //在dll项目外部使用时,用__declspec(dllimport)导入 //宏DLL_IMPLEMENT在simpledll.cpp中定义 #ifdef DLL_IMPLEMENT #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif namespace zdd { //导出类 class DLL_API SimpleDll { public: SimpleDll(); ~SimpleDll(); int add(int x, int y); //简单方法 }; }
源文件simpledll.cpp:
//------------------ simpledll.cpp ---------------- //注意此处的宏定义需要写在#include "simpledll.h"之前 //以完成在dll项目内部使用__declspec(dllexport)导出 //在dll项目外部使用时,用__declspec(dllimport)导入 #define DLL_IMPLEMENT #include "simpledll.h" namespace zdd { SimpleDll::SimpleDll() { } SimpleDll::~SimpleDll() { } int SimpleDll::add(int x, int y) { return x+y; } }
4、完成后点击Build->Build Solution,生成解决方案。可在~zdddll\Debug下查看生成的simpledll.lib和simpledll.dll.文件。
创建引用动态链接库的应用程序:
1、选择File->New->Project。
2、在New Project中选择Installed Templates->Visual C++->Win32。
3、选择Win32 Console Application,设置名称:usesimpledll。选择Add to solution。
4、单击OK,在出现的Win32 Application Wizard的Overview对话框中点击Next。
5、在Application Settings中,选择Application type下的Console application。
6、取消Additional options下的Precompiled header,勾选Empty project。
7、单击Finish创建项目。
在控制台应用程序中使用类库的功能:
1、为控制台应用程序添加main.cpp。右键单击usesimpledll项目,Add->New Item,选择C++ File(.cpp),设置名称为main,单击Add。
2、为main.cpp添加内容。如下所示:
//------------------ main.cpp ------------------- #include "simpledll.h" using namespace zdd; #include <iostream> using namespace std; int main(char argc, char**argv) { // cout << "----------------------" <<endl; SimpleDll sd; cout << "sd.add: 3+5=" << sd.add(3, 5)<<endl; cout << "sd.getConst(): "<<sd.getConst()<<endl; SimpleDll *psd = new SimpleDll; cout << "psd->add: 5+5=" << psd->add(5, 5)<<endl; cout << "psd->getConst(): "<<endl; cout << "----------------------" <<endl; cout << "please press Enter exit."<<endl; getchar(); return 0; }
3、引用simpledll项目。右键单击usesimpledll项目,选择Properties->Common Properties->Framework and References。点击Add New Reference,选择simpledll项目,单击OK。
4、设置头文件路径。选择Properties->Configuration Properties->VC++ Directories。在Include Directories项添加$(SolutionDir)\simpledll\,选择应用,确定。
5、设置usesimpledll项目为活动项目。右键单击usesimpledll项目,选择Set up StartUp Project。
6、生成解决方案。Debug运行结果如下:
3+5=8
5+5=10
更丰富的simpledll类和相关问题:
simpledll.h文件:
//------------------ simpledll.h ---------------- #pragma once; //该宏完成在dll项目内部使用__declspec(dllexport)导出 //在dll项目外部使用时,用__declspec(dllimport)导入 //宏DLL_IMPLEMENT在simpledll.cpp中定义 #ifdef DLL_IMPLEMENT #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif namespace zdd { //导出类 class DLL_API SimpleDll { public: SimpleDll(); ~SimpleDll(); int add(int x, int y); //简单方法 static int sub(int x, int y);//静态方法 int getConst(); // int getNum(); private: void setNum(int n); int num; }; //全局变量 int DLL_API number; SimpleDll DLL_API sdd; //对于指针,下面两种用法没区别? SimpleDll DLL_API *psdd; SimpleDll *psdd1; //方法 int DLL_API Add(int a, int b); SimpleDll *createClass() { return new SimpleDll; } /* //问题1:若这样使用,则出现如下错误: // error C2059: syntax error : '__declspec(dllexport)' // error C2143: syntax error : missing ';' before '{' // error : '__declspec(dllimport)' // error C2143: syntax error : missing ';' before '{' // error C2447: '{' : missing function header (old-style formal list?) //为什么? SimpleDll* DLL_API createClass1() { return new SimpleDll; } */ /* //问题2:若这样使用,则出现如下错误: //Error 1 error C2491: 'zdd::createClass1' : definition of dllimport function not allowed usesimpledll //为什么? SimpleDll DLL_API * createClass2() { return new SimpleDll; } */ //问题3:这样使用(实现在.cpp中),编译没有问题。 //但在main中应用时回出现以下错误: // error LNK2019: unresolved external symbol "class zdd::SimpleDll * __cdecl zdd::createClass3(void)" (?createClass3@zdd@@YAPAVSimpleDll@1@XZ) referenced in function _main //该如何解决? SimpleDll *createClass3(); //先别这样用 //全局方法加DLL_API和不加DLL_API时的区别 int DLL_API getConst1(); //int getConst2(); //不要这样使用 //也不要这样用 //否则当程序发布之后,如果只想通过更新.dll //来达到更新程序数据的目的,比如将此处的100更新成10. //通过下面的方法你是做不到的 int getConst2() { return 100; // return 10; } //也不要这样用,否则将出现如下错误 //error C2491: 'zdd::getConst3' : definition of dllimport function not allowed /* int DLL_API getConst3() { return 100; } */ //不要这样用,同理 int others(int a) { return a+10; } }
simpledll.cpp文件:
//------------------ simpledll.cpp ---------------- //注意此处的宏定义需要写在#include "simpledll.h"之前 //以完成在dll项目内部使用__declspec(dllexport)导出 //在dll项目外部使用时,用__declspec(dllimport)导入 #define DLL_IMPLEMENT #include "simpledll.h" namespace zdd { SimpleDll::SimpleDll() { } SimpleDll::~SimpleDll() { } int SimpleDll::add(int x, int y) { return x+y; } int SimpleDll::sub(int x, int y) { return x-y; } int SimpleDll::getConst() { return 10; // } void SimpleDll::setNum(int n) { num = n; } int SimpleDll::getNum() { return num; } extern int number = 5; int Add(int a, int b) { return a+b; } SimpleDll *createClass3() { return new SimpleDll; } int getConst1() { return 100; //return 10; } /* //error extern int getConst2() { return 100; } */ }
main.cpp文件:
//------------------ main.cpp ------------------- #include "simpledll.h" using namespace zdd; #include <iostream> using namespace std; int main(char argc, char**argv) { // cout << "----------------------" <<endl; SimpleDll sd; cout << "sd.add: 3+5=" << sd.add(3, 5)<<endl; cout << "sd.getConst(): "<<sd.getConst()<<endl; SimpleDll *psd = new SimpleDll; cout << "psd->add: 5+5=" << psd->add(5, 5)<<endl; cout << "psd->getConst(): "<<endl; cout << "----------------------" <<endl; cout << "SimpleDll::sub: 2-1=" << SimpleDll::sub(2,1)<<endl; cout << "----------------------" <<endl; cout << "zdd::number: "<<number<<endl; number = 10; cout << "changed zdd::number: "<<number<<endl; cout << "----------------------" <<endl; cout << "sdd.add: 6+8=" << sdd.add(6,8)<<endl; cout << "psdd->add: 6+8=" <<psdd->add(6,8)<<endl; cout << "psdd1->add: 6+8=" <<psdd1->add(6,8)<<endl; cout <<endl; cout << "sdd.getConst(): "<<sd.getConst()<<endl; cout << "psdd.getConst(): "<<psdd->getConst()<<endl; cout << "psdd1.getConst(): "<<psdd1->getConst()<<endl; cout << "----------------------" <<endl; cout << "zdd::Add: 7+8="<<Add(7,8)<<endl; cout << "----------------------" <<endl; SimpleDll *p = createClass(); cout << "create->add: 2+3=" <<p->add(3,2)<<endl; cout << "create->getConst(): "<<p->getConst()<<endl; cout << "----------------------" <<endl; // SimpleDll *p3 = createClass3(); // cout << "create3->add: 2+3=" <<p3->add(3,2)<<endl; // cout << "create3->getConst(): "<<p3->getConst()<<endl; // cout << "----------------------" <<endl; cout << "----------------------" <<endl; //请别在你的应用程序中使用getConst2 cout << "DLL_API getConst1: "<<getConst1()<<endl; cout << " getConst2: "<<getConst2()<<endl; // cout << "DLL_API getConst3: "<<getConst3()<<endl; cout << "----------------------" <<endl; // cout << "others: " << others(6)<<endl; // cout << "others: " << others(16)<<endl; // cout << "----------------------" <<endl; cout << "please press Enter exit."<<endl; getchar(); return 0; }
运行结果为:
---------------------- sd.add: 3+5=8 sd.getConst(): 10 psd->add: 5+5=10 psd->getConst(): ---------------------- SimpleDll::sub: 2-1=1 ---------------------- zdd::number: 5 changed zdd::number: 10 ---------------------- sdd.add: 6+8=14 psdd->add: 6+8=14 psdd1->add: 6+8=14 sdd.getConst(): 10 psdd.getConst(): 10 psdd1.getConst(): 10 ---------------------- zdd::Add: 7+8=15 ---------------------- create->add: 2+3=5 create->getConst(): 10 ---------------------- ---------------------- DLL_API getConst1: 100 getConst2: 100 ---------------------- please press Enter exit.
转自:http://blog.csdn.net/zddmail/article/details/7352917