您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > VS2005创建动态库和调用动态库函数
如何创建动态链接库和调用动态链接库(入门教程)声明:此教程是我初学动态链接库时写的,作为自己的学习笔记,同时也希望能够帮助还在迷惑的初学者。我的学习资料主要来自于互联网,因此也想把自己的东西分享给大家。希望共同交流。如果你已经是高手,请绕开。开发平台:Windowsxpsp3编译环境:VS2005开发语言:C/C++VB版本:VB6.0希望我们共同交流看法,请联系bai_yechuang@163.com陈搏于2012,8,27日废话少说,直接进入正题。一.创建DLL库(WIN32DLL)点击“OK”点击“Next”点击'“Finish”下面是.cpp和对应的.h文件,先浏览一遍导出DLL库分为2种,一种是用关键字__declspec(dllexport)一种是使用def文件。1.使用关键字导出DLL编写自己的三个函数//1.求个数的最大数DLLTEST_APIintMaxFun(intx,inty){return((xy)?(x):(y));}//2.求和DLLTEST_APIintAddFun(intx,inty){return(x+y);}//3.打印DLLTEST_APIvoidPrintFun(void){std::cout调用动态库函数std::endl;}DLLTEST_API表示此函数导出看看编译结果dlltest.dll就是我们导出的动态库文件下面我们写一个控制台程序来调用此函数1.隐式调用把dlltest.dlldlltest.libdlltest.h三个文件考到本地工程目录下面程序如下:结果:2.显示调用动态库函数只需要将dlltest.dll文件复制到本地工程目录下。结果:二:在VB中如何调用DLL库VB界面如下:2个按钮对应2个DLL函数的功能,有一个函数没有参数和返回值在VB中无法使用我们暂且不用。其遇到的种种错误再此就不多说,直接说正确的调用方法。如果要想其它平台能够调用VCDLL库,需要在以前的基础上做一些修改。1.使用def文件的方式导出DLL库之前的dlltest.h就不需要啦。函数前面不需要加DLLTEST_API宏。2.VC++默认的调用约定方式为__cdeclVB的默认的调用约定方式为__stdcall.所以在DLL文件中的函数名前面要加上__stdcall把函数转换为VB默认调用约定方式。3.重新编译生成dlltest.dllVC++DLL程序示例Def文件编写VB程序示例:到现简单的总结一下:创建DLL库我们可以使用2种方法:1,关键字的方式2.def文件的方式调用DLL函数也有2种方法:1,隐式调用2,显示调用如果要在其它平台使用VC++的动态库如VB。注意两者的默认调用方式不同,使用DEF文件导出DLL另外推荐DLL函数查看器工具可以方便的查看DLL文件中的函数名。注意函数前加externC和不加externC生成的DLL文件,大家用DLL函数查看器看看函数名称有什么变化?附DLL库相关源码:dlltest.cpp//dlltest.cpp:DefinestheentrypointfortheDLLapplication.#includestdafx.h//#includedlltest.h#includeiostream#ifdef_MANAGED#pragmamanaged(push,off)#endif//每一个DLL库都有一个DllMain函数,DLL库被调用和释放的时候用调用此函数BOOLAPIENTRYDllMain(HMODULEhModule,DWORDul_reason_for_call,LPVOIDlpReserved){switch(ul_reason_for_call){caseDLL_PROCESS_ATTACH:caseDLL_THREAD_ATTACH:caseDLL_THREAD_DETACH:caseDLL_PROCESS_DETACH:break;}returnTRUE;}#ifdef_MANAGED#pragmamanaged(pop)#endif//1.求个数的最大数int__stdcallMaxFun(intx,inty){return((xy)?(x):(y));}//2.求和int__stdcallAddFun(intx,inty){return(x+y);}//3.打印void__stdcallPrintFun(void){std::cout调用动态库函数std::endl;}//下面这些都是示例,演示了如何导出变量函数类结合头文件看。可以把他们注释掉写自己的函数//Thisisanexampleofanexportedvariable//DLLTEST_APIintndlltest=0;//Thisisanexampleofanexportedfunction.//DLLTEST_APIintfndlltest(void)//{//return42;//}//Thisistheconstructorofaclassthathasbeenexported.//seedlltest.hfortheclassdefinition//Cdlltest::Cdlltest()//{//return;//}dlltest.h//Thefollowingifdefblockisthestandardwayofcreatingmacroswhichmakeexporting//fromaDLLsimpler.AllfileswithinthisDLLarecompiledwiththeDLLTEST_EXPORTS//symboldefinedonthecommandline.thissymbolshouldnotbedefinedonanyproject//thatusesthisDLL.Thiswayanyotherprojectwhosesourcefilesincludethisfilesee//DLLTEST_APIfunctionsasbeingimportedfromaDLL,whereasthisDLLseessymbols//definedwiththismacroasbeingexported.#ifndefDLLTEST#defineDLLTEST#ifndefDLLTEST_EXPORTS#defineDLLTEST_EXPORTS#endif#ifdefDLLTEST_EXPORTS#defineDLLTEST_APIexternC__declspec(dllexport)//在函数和变量,类中加上次关键字表示它是导出的接口。#else#defineDLLTEST_API__declspec(dllimport)#endif//下面都是示例,可以注视掉//Thisclassisexportedfromthedlltest.dll//classDLLTEST_APICdlltest{//public://Cdlltest(void);//TODO:addyourmethodshere.//};//externDLLTEST_APIintndlltest;//DLLTEST_APIintfndlltest(void);//声明函数DLLTEST_APIintMaxFun(intx,inty);DLLTEST_APIintAddFun(intx,inty);DLLTEST_APIvoidPrintFun(void);#endifbuilder.defLIBRARYdlltestEXPORTSMaxFun@1AddFun@2PrintFun@3
本文标题:VS2005创建动态库和调用动态库函数
链接地址:https://www.777doc.com/doc-4684597 .html