vs创建和使用动态链接库dll.docx
《vs创建和使用动态链接库dll.docx》由会员分享,可在线阅读,更多相关《vs创建和使用动态链接库dll.docx(4页珍藏版)》请在冰豆网上搜索。
vs创建和使用动态链接库dll
vs2010创建和使用动态链接库(dll)
1、打开MicrosoftVisualStudio2010,选择File->New->Project。
2、在NewProject中选择InstalledTemplates->VisualC++->Win32。
3、选择Win32ConsoleApplication,设置名称:
simpledll,设置解决方案名:
zdddll。
4、单击OK,在出现的Win32ApplicationWizard的Overview对话框中点击Next。
5、在ApplicationSettings中,选择Applicationtype下的DLL。
6、勾选Additionaloptions下的Emptyproject。
7、单击Finish创建项目。
向动态链接库添加类:
1、添加新类头文件。
右键单击simpledll项目,Add->NewItem,选择HeaderFile(.h),设置名称为simpledll,单击Add。
2、添加新类源文件。
右键单击simpledll项目,Add->NewItem,选择C++File(.cpp),设置名称为simpledll,单击Add。
3、为新类添加内容。
内容如下:
头文件simpledll.h:
[html]viewplaincopyprint?
//------------------simpledll.h----------------#pragmaonce;//该宏完成在dll项目内部使用__declspec(dllexport)导出//在dll项目外部使用时,用__declspec(dllimport)导入//宏DLL_IMPLEMENT在simpledll.cpp中定义#ifdefDLL_IMPLEMENT#defineDLL_API__declspec(dllexport)#else#defineDLL_API__declspec(dllimport)#endifnamespacezdd{//导出类classDLL_APISimpleDll{public:
SimpleDll();~SimpleDll();intadd(intx,inty);//简单方法};}
源文件simpledll.cpp:
[cpp]viewplaincopyprint?
//------------------simpledll.cpp----------------//注意此处的宏定义需要写在#include"simpledll.h"之前//以完成在dll项目内部使用__declspec(dllexport)导出//在dll项目外部使用时,用__declspec(dllimport)导入#defineDLL_IMPLEMENT#include"simpledll.h"namespacezdd{SimpleDll:
:
SimpleDll(){}SimpleDll:
:
~SimpleDll(){}intSimpleDll:
:
add(intx,inty){returnx+y;}}4、完成后点击Build->BuildSolution,生成解决方案。
可在~zdddll\Debug下查看生成的simpledll.lib和simpledll.dll.文件。
创建引用动态链接库的应用程序:
1、选择File->New->Project。
2、在NewProject中选择InstalledTemplates->VisualC++->Win32。
3、选择Win32ConsoleApplication,设置名称:
usesimpledll。
选择Addtosolution。
4、单击OK,在出现的Win32ApplicationWizard的Overview对话框中点击Next。
5、在ApplicationSettings中,选择Applicationtype下的Consoleapplication。
6、取消Additionaloptions下的Precompiledheader,勾选Emptyproject。
7、单击Finish创建项目。
在控制台应用程序中使用类库的功能:
1、为控制台应用程序添加main.cpp。
右键单击usesimpledll项目,Add->NewItem,选择C++File(.cpp),设置名称为main,单击Add。
2、为main.cpp添加内容。
如下所示:
[cpp]viewplaincopyprint?
//------------------main.cpp-------------------#include"simpledll.h"usingnamespacezdd;#include<iostream>usingnamespacestd;intmain(charargc,char**argv){//cout<<"----------------------"<<endl;SimpleDllsd;cout<<"sd.add:
3+5="<<sd.add(3,5)<<endl;cout<<"sd.getConst():
"<<sd.getConst()<<endl;SimpleDll*psd=newSimpleDll;cout<<"psd->add:
5+5="<<psd->add(5,5)<<endl;cout<<"psd->getConst():
"<<endl;cout<<"----------------------"<<endl;cout<<"pleasepressEnterexit."<<endl;getchar();return0;}
3、引用simpledll项目。
右键单击usesimpledll项目,选择Properties->CommonProperties->FrameworkandReferences。
点击AddNewReference,选择simpledll项目,单击OK。
4、设置头文件路径。
选择Properties->ConfigurationProperties->VC++Directories。
在IncludeDirectories项添加$(SolutionDir)\simpledll\,选择应用,确定。
5、设置usesimpledll项目为活动项目。
右键单击usesimpledll项目,选择SetupStartUpProject。
6、生成解决方案。
Debug运行结果如下:
[cpp]viewplaincopyprint?
3+5=85+5=10
更丰富的simpledll类和相关问题:
simpledll.h文件:
[cpp]viewplaincopyprint?
//------------------simpledll.h----------------#pragmaonce;//该宏完成在dll项目内部使用__declspec(dllexport)导出//在dll项目外部使用时,用__declspec(dllimport)导入//宏DLL_IMPLEMENT在simpledll.cpp中定义#ifdefDLL_IMPLEMENT#defineDLL_API__declspec(dllexport)#else#defineDLL_API__declspec(dllimport)#endifnamespacezdd{//导出类classDLL_APISimpleDll{public:
SimpleDll();~SimpleDll();intadd(intx,inty);//简单方法staticintsub(intx,inty);//静态方法intgetConst();//intgetNum();private:
voidsetNum(intn);intnum;};//全局变量intDLL_APInumber;SimpleDllDLL_APIsdd;//对于指针,下面两种用法没区别?
SimpleDllDLL_API*psdd;SimpleDll*psdd1;//方法intDLL_APIAdd(inta,intb);SimpleDll*createClass(){returnnewSimpleDll;}/*//问题1:
若这样使用,则出现如下错误:
//errorC2059:
syntaxerror:
'__declspec(dllexport)'//errorC2143:
syntaxerror:
missing';'before'{'//error:
'__declspec(dllimport)'//errorC2143:
syntaxerror:
missing';'before'{'//errorC2447:
'{':
missingfunctionheader(old-styleformallist?
)//为什么?
SimpleDll*DLL_APIcreateClass1(){returnnewSimpleDll;}*//*//问题2:
若这样使用,则出现如下错误:
//Error1errorC2491:
'zdd:
:
createClass1':
definitionofdllimportfunctionnotallowedusesimpledll//为什么?
SimpleDllDLL_API*createClass2(){returnnewSimpleDll;}*///问题3:
这样使用(实现在.cpp中),编译没有问题。
//但在main中应用时回出现以下错误:
//errorLNK2019:
unresolvedexternalsymbol"classzdd:
:
SimpleDll*__cdeclzdd:
:
createClass3(void)"(?
createClass3@zdd@@YAPAVSimpleDll@1@XZ)referencedinfunction_main//该如何解决?
SimpleDll*createClass3();//先别这样用//全局方法加DLL_API和不加DLL_API时的区别intDLL_APIgetConst1();//intgetConst2();//不要这样使用//也不要这样用//否则当程序发布之后,如果只想通过更新.dll//来达到更新程序数据的目的,比如将此处的100更新成10.//通过下面的方法你是做不到的intgetConst2(){return100;//return10;}//也不要这样用,否则将出现如下错误//errorC2491:
'zdd:
:
getConst3':
definitionofdllimportfunctionnotallowed/*intDLL_APIgetConst3(){return100;}*///不要这样用,同理intothers(inta){returna+10;}}
simpledll.cpp文件:
[cpp]viewplaincopyprint?
//------------------simpledll.cpp----------------//注意此处的宏定义需要写在#include"simpledll.h"之前//以完成在dll项目内部使用__declspec(dllexport)导出//在dll项目外部使用时,用__declspec(dllimport)导入#defineDLL_IMPLEMENT#include"simpledll.h"namespacezdd{SimpleDll:
:
SimpleDll(){}SimpleDll:
:
~SimpleDll(){}intSimpleDll:
:
add(intx,inty){returnx+y;}intSimpleDll:
:
sub(intx,inty){returnx-y;}intSimpleDll:
:
getConst(){return10;//}voidSimpleDll:
:
setNum(intn){num=n;}intSimpleDll:
:
getNum(){returnnum;}externintnumber=5;intAdd(inta,intb){returna+b;}SimpleDll*createClass3(){returnnewSimpleDll;}intgetConst1(){return100;//return10;}/*//errorexternintgetConst2(){return100;}*/}
main.cpp文件:
[cpp]viewplaincopyprint?
//------------------main.cpp-------------------#include"simpledll.h"usingnamespacezdd;#include<iostream>usingnamespacestd;intmain(charargc,char**argv){//cout<<"----------------------"<<endl;SimpleDllsd;cout<<"sd.add:
3+5="<<sd.add(3,5)<<endl;cout<<"sd.getConst():
"<<sd.getConst()<<endl;SimpleDll*psd=newSimpleDll;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<<"changedzdd:
:
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;//请别在你的应用程序中使用getConst2cout<<"DLL_APIgetConst1:
"<<getConst1()<<endl;cout<<"getConst2:
"<<getConst2()<<endl;//cout<<"DLL_APIgetConst3:
"<<getConst3()<<endl;cout<<"----------------------"<<endl;//cout<<"others:
"<<others(6)<<endl;//cout<<"others:
"<<others(16)<<endl;//cout<<"----------------------"<<endl;cout<<"pleasepressEnterexit."<<endl;getchar();return0;}
运行结果为:
[html]viewplaincopyprint?
----------------------sd.add:
3+5=8sd.getConst():
10psd->add:
5+5=10psd->getConst():
----------------------SimpleDll:
:
sub:
2-1=1----------------------zdd:
:
number:
5changedzdd:
:
number:
10----------------------sdd.add:
6+8=14psdd->add:
6+8=14psdd1->add:
6+8=14sdd.getConst():
10psdd.getConst():
10psdd1.getConst():
10----------------------zdd:
:
Add:
7+8=15----------------------create->add:
2+3=5create->getConst():
10--------------------------------------------DLL_APIgetConst1:
100getConst2:
100----------------------pleasepressEnterexit.
可将生成的可执行文件和应用程序拷出到同一目录下,通过更改方法getConst1,getConst2,体会dllexport和dllimport的作用。