VS2010下创建静态链接库和动态链接库

上传人:ca****in 文档编号:77576336 上传时间:2022-04-20 格式:DOCX 页数:31 大小:383.15KB
收藏 版权申诉 举报 下载
VS2010下创建静态链接库和动态链接库_第1页
第1页 / 共31页
VS2010下创建静态链接库和动态链接库_第2页
第2页 / 共31页
VS2010下创建静态链接库和动态链接库_第3页
第3页 / 共31页
资源描述:

《VS2010下创建静态链接库和动态链接库》由会员分享,可在线阅读,更多相关《VS2010下创建静态链接库和动态链接库(31页珍藏版)》请在装配图网上搜索。

1、类封装成dll如果你的工作长期与某个领域相关,比如说长期做直接体绘制 (DVR)方面的开发,那么你可能经常使用自己的传递函数类,如果每一个工程你都把传递函数类的.h和.cpp文件添加进去会比较麻烦,其实,我们可以像 使用opengl的库那样来用你自己的类,做法就是把你写好的类封装成dll,具体做法如下: 第一步:制作dll 利用VC6新建工程时选择win32 dynamic-Link Library(空的工程),然后添加头文件和cpp文件。假设你要封装的类的名成是TransferFunction,添加头文件 TransferFunction.h和TransferFunction.cpp到工程中

2、。并将TransferFunction.h修改成: class _declspec(dllexport) TransferFunction . 从而说明以后从dll要被导出的类是哪一个。这样编译完就会产生TransferFunction.dll和TransferFunction.lib两个文件。 第二步:如何使用这个dll 当已经生成dll后,有两种方法可以在其它程序中调用dll中的类和成员函数: 方法一: 1)把TransferFunction.dll和TransferFunction.lib复制到调用程序的执行路径下,注意不是debug路径下。 2)在project-setting-lin

3、k里添加TransferFunction.lib(或者用#pragma comment(lib, TransferFunction.lib) ) 3)把TransferFunction.h中的_declspec(dllexport)改成_declspec(dllimport) 然后复制到调用程序的执行路径下。 4)最后在主程序中就可以通过包含TransferFunction.h来使用TransferFunction类和它的成员函数。 方法二(推荐): 在方法一中,你每次建立一个工程都需要把 TransferFunction.dll,TransferFunction.lib,TransferFu

4、nction.h三个文件拷贝到工程里面 去,事实上这只发挥了dll对类的代码保护的功能,并没有多大的减轻编程人员的工作量,下面的方法可以减少编程人员的工作量,具体步骤: undefined1:将TransferFunction.dll扔到windowssystem32下 2:将.TransferFunctionlib扔到VC的lib目录里 3:将方法一中的TransferFunction.h扔到VC的include目录里 4:同方法一的最后一步。 以后你就可以像使用Opengl的glut、glui等库一样使用你自己封装的一个经常复用的类了。VS2010下创建静态链接库和动态链接库 下面介绍一下

5、用VS2010如何创建静态链接库和动态链接库,并测试创建的库。1.静态链接库打开VS2010,新建一个项目,选择win32项目,点击确定,选择静态库这个选项,预编译头文件可选可不选。 在这个空项目中,添加一个.h文件和一个.cpp文件。名字我们起为static.h和static.cpp static.h文件:cppview plaincopy 1. #ifndef LIB_H2. #define LIB_H3.4. extern C int sum(int a,int b);5.6. #endifstatic.cpp文件:1.#include static.h2.3. int sum(int

6、a,int b) 4. 5. return a+b; 6. 编译这个项目之后,会在debug文件夹下生成static.lib文件,这个就是我们需要的静态链接库。下面说明如何调用静态链接库。首先需要新建一个空项目,起名为test。将之前static项目下的static.h和static.lib这个2个文件复制到test项目的目录下,并在工程中加入static.h文件。新建一个test.cpp文件如下:cppview plaincopy 1. #include 2. #include 3. #include static.h4.5. #pragma comment(lib,static.lib)6

7、.7. int main()8. 9. printf(%dn,sum(1,2);第2 / 5页10. system(pause); 11. return 0;12. 编译运行可得结果:3 #pragma comment(lib,static.lib),这一句是显式的导入静态链接库。除此之外,还有其他的方法,比如通过设置路径等等,这里不做介绍。2.动态链接库和创建静态链接库一样,需要创建一个空的win32项目,选择dll选项。创建dynamic.cpp和dynamic.h文件dynamic.h文件:cppview plaincopy1. #ifndef DYNAMIC2. #define DYN

8、AMIC3.4. extern C _declspec(dllexport)int sum(int a, int b);5.6. #endif DYNAMIC第3 / 5页dynamic.cpp文件:cppview plaincopy 1. #include dynamic.h 2.3. int sum(int a, int b)4. 5. return a+b;6. 编译这个项目,会在debug文件夹下生成dynamic.dll文件。下面介绍如何调用动态链接库,这里讲的是显式的调用。在刚才的test项目下,把static.lib和static.h文件删除,把dynamic.h和dynamic

9、.dll复制到该目录下,并在项目中添加dynamic.h文件,修改test.cpp文件为:cppview plaincopy1. #include 2. #include 3. #include4. #include dynamic.h5. int main()第4 / 5页6. 7. HINSTANCE hDll=NULL;8. typedef int(*PSUM)(int a,int b);9. PSUM pSum;10. hDll = LoadLibrary(Ldynamic.dll);11. pSum = (PSUM)GetProcAddress(hDll,sum);12. print

10、f(%dn,pSum(1,2);13. system(pause);14. FreeLibrary(hDll);15. return 0;16. 17. 编译运行结果为:3特别提示:1.extern C中的C是大写,不是小写2.如果从VS2010中直接运行程序,lib和dll需要放到test项目的目录下;如果想双击项目test下的debug文件中的exe文件直接运行的话,需把lib和dll放入debug文件夹下。VS2010下静态链接库和动态链接库总结尚哥发表于 8月前 (2015-01-28 08:46:16) | 评论(0)| 阅读次数(1518)|0人收藏此文章, 我要收藏静态链接库对于

11、静态链接库是函数库的情况如下:生成静态链接库:必须要有头文件。对于静态链接库是函数库的情况如下:.h文件中是函数的声明,.cpp文件中是函数的实现。举例: jj测试静态链接库(1) #include “.h” /编译时候需要 注意:如果.h文件不在源程序文件同级目录下,需要配置VS环境:项目属性-配置属性-C/C+-常规-附加包含目录,可以事先将.h文件放到某个位置的lnclude文件夹中,当添加附加包含目录时候将其定位到该lnclude文件夹。(2) #pragma comment(lib,*.lib) 或者配置VS环境方式引入库文件.lib,具体项目属性-配置属性-链接器-输入-附加依赖项

12、 /链接时候需要 注意:如果.lib库文件不在源程序文件同级目录下,需要配置VS环境:项目属性-配置属性-链接器-常规-附加库目录,可以事先将.lib文件放到某个位置的lib文件夹中,当添加附加库目录时候将其定位到该lib文件夹。举例:对于动态链接库是函数库的情况如下:动态链接库生成动态链接库:头文件可以不要。但一般第三方都会有头文件,因为如果没有头文件,则需要在实现文件中使用函数之前声明函数,而一般对于用户来讲都是不知道函数声明的,而且对于一个工程中使用多个导出函数的情况还需要多个函数的声明比较麻烦,所以实际中还是都有头文件的。头文件是函数的声明,声明前需要修饰符_declspec(dlle

13、xport) 或者extern 也行,如果动态库是用C语言写的,就需要写成 externa “C”的方式。(说明:实际上,当你想导入一个符号时,你不需要用到_declspec(dllimport). 用extern就可以了。但是,如果用_declspec(dllimport)的话,编译器会生成更有效率的代码。)实现文件函数前就不再需要修饰符_declspec(dllexport) 等了。测试动态链接库对于提供头文件的情况:#include .h /路径问题同静态链接库头文件引入 编译时候需要#pragma comment(lib,*.lib) /路径问题同静态链接库库引入,实际对于动态链接库来

14、讲,此时的.lib文件是导入库。 链接时候需要不提供头文件的情况:不需要写#include .h ,因为没有。此时要完成函数声明功能,需要使用extern int add(int x,int y);来实现函数的声明或者 _declspec(dllimport) int add(int x,int y)来声明引入的函数。#pragma comment(lib,*.lib) /路径问题同静态链接库库引入,实际对于动态链接库来讲,此时的.lib文件是导入库。 链接时候需要。1.隐式调用 把dlltest.dlldlltest.lib dlltest.h 三个文件考到本地工程目录下面2.显示调用动态库

15、函数 只需要将dlltest.dll文件复制到本地工程目录下。一般动态链接库的标准写法如下:VC+ 程序 如何封装为dll文件VC+分享到:专业回答ljmdzyx0072013-09-13 22:28创建新的动态链接库 (DLL) 项目从 “文件”菜单中,选择 “新建”,然后选择 “项目”。在 “项目类型”窗格中,选择 “Visual C+”下的 “Win32”。在 “模板”窗格中,选择 “Win32 控制台应用程序”。为项目选择一个名称,如MathFuncsDll,并将其键入 “名称”字段。 为解决方案选择一个名称,如DynamicLibrary,并将其键入 “解决方案名称”字段。单击 “确

16、定”启动 Win32 应用程序向导。在 “Win32 应用程序向导”对话框的 “概述”页中,单击 “下一步”。在 “Win32 应用程序向导”中的 “应用程序设置”页中,选择 “应用程序类型”下的 “DLL”(如果可用),或者选择 “控制台应用程序”(如果 “DLL”不可用)。 某些版本的 Visual Studio不支持通过使用向导创建 DLL 项目。您可以稍后对此进行更改,以将项目编译为DLL。在 “Win32 应用程序向导”的 “应用程序设置”页中,选择 “附加选项”下的 “空项目”。单击 “完成”创建项目。向动态链接库添加类若要为新类创建头文件,请从 “项目”菜单中选择 “添加新项”。

17、将显示 “添加新项”对话框。在 “类别”窗格中,选择 “Visual C+”下的 “代码”。 在 “模板”窗格中选择 “头文件(.h)”。 为头文件选择一个名称,如MathFuncsDll.h,并单击 “添加”。 将显示一个空白文件。添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。代码应与以下内容类似:以带有颜色区分的格式查看复制到剪贴板打印/ MathFuncsDll.hnamespace MathFuncsclass MyMathFuncspublic:/ Returns a + bstatic _declspec(dllexport) double

18、 Add(double a, double b);/ Returns a - bstatic _declspec(dllexport) double Subtract(double a, double b);/ Returns a * bstatic _declspec(dllexport) double Multiply(double a, double b);/ Returns a / b/ Throws DivideByZeroException if b is 0static _declspec(dllexport) double Divide(double a, double b);

19、/ MathFuncsDll.hnamespace MathFuncsclass MyMathFuncspublic:/ Returns a + bstatic _declspec(dllexport) double Add(double a, double b);/ Returns a - bstatic _declspec(dllexport) double Subtract(double a, double b);/ Returns a * bstatic _declspec(dllexport) double Multiply(double a, double b);/ Returns

20、 a / b/ Throws DivideByZeroException if b is 0static _declspec(dllexport) double Divide(double a, double b);请注意此代码方法声明中的 _declspec(dllexport) 修饰符。 这些修饰符使 DLL能够导出该方法以供其他应用程序使用。有关更多信息,请参见 dllexport, dllimport。若要为新类创建源文件,请从 “项目”菜单中选择 “添加新项”。将显示 “添加新项”对话框。在 “类别”窗格中,选择 “Visual C+”下的 “代码”。 在 “模板”窗格中,选择 “C

21、+ 文件(.cpp)”。 为源文件选择一个名称,如MathFuncsDll.cpp,并单击 “添加”。 将显示一个空白文件。在源文件中实现“MyMathFuncs”的功能。代码应与以下内容类似:以带有颜色区分的格式查看复制到剪贴板打印/ MathFuncsDll.cpp/ compile with: /EHsc /LD#include MathFuncsDll.h#include using namespace std;namespace MathFuncsdouble MyMathFuncs:Add(double a, double b)return a + b;double MyMathF

22、uncs:Subtract(double a, double b)return a - b;double MyMathFuncs:Multiply(double a, double b)return a * b;double MyMathFuncs:Divide(double a, double b)if (b = 0)throw new invalid_argument(b cannot be zero!);return a / b;/ MathFuncsDll.cpp/ compile with: /EHsc /LD#include MathFuncsDll.h#include using

23、 namespace std;namespace MathFuncsdouble MyMathFuncs:Add(double a, double b)return a + b;double MyMathFuncs:Subtract(double a, double b)return a - b;double MyMathFuncs:Multiply(double a, double b)return a * b;double MyMathFuncs:Divide(double a, double b)if (b = 0)throw new invalid_argument(b cannot

24、be zero!);return a / b;若要将项目生成为 DLL,请从“项目”菜单中选择MathFuncsDll “属性.”。 在左窗格中,选择 “配置属性”下的 “常规”。在右窗格中,将 “配置类型”更改为 “动态库(.dll)”。单击 “确定”保存更改。说明如果您从命令行生成项目,请使用/LD 编译器选项指定输出文件应为 DLL。有关更多信息,请参见 /MD、/MT、/LD(使用运行库)。编译该动态链接库,方法是选择“生成”菜单中的 “生成解决方案”。这样就创建了一个可供其他程序使用的DLL。VS2010生成静态库(.lib)时间2013-06-17 18:37:46CSDN博客原文

25、主题Visual Studio动态库打开VS2010,新建一个项目,选择win32项目,点击确定,选择静态库这个选项,预编译头文件不选。在这个空项目中,添加一个.h文件和一个.cpp文件。名字我们起为static.h和static.cppstatic.h文件:#ifndef LIB_H#define LIB_H extern C int sum(int a,int b); extern C int substract(int a,int b); #endifstatic.cpp文件#include static.hint sum(int a,int b) return a+b;int subs

26、tract(int a,int b) return a-b;编译这个项目之后(生成生成解决方案),会在debug文件夹下生成static.lib文件,这个就是我们需要的静态链接库。下面说明如何调用静态链接库。首先需要新建一个空项目,起名为test。将之前static项目下的static.h和static.lib这个2个文件复制到test项目的目录下,并在工程中加入static.h文件。新建一个test.cpp文件如下:#include static.h#include #include #pragma comment(lib,static.lib)int main() printf(%dn,s

27、um(1,2); printf(%dn,substract(4,3); system(pause); return 0;编译运行可得结果:31#pragma comment(lib,static.lib),这一句是显式的导入静态链接库。除此之外,还有其他的方法,比如通过设置路径等等,这里不做介绍。或者选中工程名,点击右键-属性,在“VC+目录”的包含目录里面加入static.h的所在目录的路径,库目录里面加入static.lib所在目录的路径;在链接器-输入-附加依赖项输入“static.lib”。然后源文件里添加#includestatic.h就OK了。题外话摘自百度百科:程序编译一般需经预

28、处理、编译、汇编和链接几个步骤。在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的复本,因此节省了很多内存。Dl

29、l无法直接导出泛型模板(generalizedtemplate),因此,如果要导出stl类,则模板必须先实例化(instantiated)。另外,如果导出的STL类使用了其他STL类,那么这些其他类必须同时被导出。目前stl中唯一能够被导出的容器是vector,其他容器(如map、set、queue、list、deque)都因包含嵌套类而不能被导出。导出STL类的步骤:在Dll和exe文件中,用同样版本的c运行库链接。譬如都用Msvcrt.lib(release)链接或都用Msvcrtd.lib(debug)链接。Dll中,用_declspec(dllexport)导出模板类的实例。在exe文

30、件中,用_declspec(dllimport)和extern关键字从Dll中导入stl类。需要注意的是:当导出一个以自定义类为模板参数的stl容器,必须为这个自定义类型定义和=运算符。譬如,如果要导出std:vector类,则必须为CPerson添加和=运算符。#ifdefEXP_STL#defineDECLSPECIFIER_declspec(dllexport)#defineEXPIMP_TEMPLATE#else#defineDECLSPECIFIER_declspec(dllimport)#defineEXPIMP_TEMPLATEextern#endif/导出stl类std:vec

31、torclassCPersonpublic:intm_nAge;charm_strName40;public:booloperator(constCPerson&c)constreturntrue;booloperator=(constCPerson&c)constreturntrue;EXPIMP_TEMPLATEtemplateclassVECDLL_APIstd:vector;/显式实例化模板类VECDLL_APIintfnVecDll(std:vector&vecPer);/导出函数定义这两个运算符的原因是:所有stl容器都有比较成员函数,这些成员函数需要调用自定义类型的和=运算符。通

32、常情况下,由于没有使用这些成员函数,所以它们没有被实例化,所以我们使用时一般就不需要为CPerson定义这两个运算符。然而,当显示实例化此容器类时,它所有的成员函数都需实例化,包括它的“比较”成员函数,所以这时必须实现CPerson的和=运算符。如果CPerson并不在乎和=的意义,我们可以像上面代码所示通过简单返回true来实现它们。导出一个数据成员包含stl对象的类。方法与上类似。如下代码所示:EXPIMP_TEMPLATEtemplateclassVECDLL_APIstd:vector/显式实例化std:vectorclassVECDLL_APICContainerpublic:std

33、:vectorm_vecNum;VS下 dllimport与dllexport作用与区别时间:2014-11-24 18:32:32 阅读:234 评论:0 收藏:0点我收藏+标签:desclassstyle代码使用comlog文件问题我相信写WIN32程序的人,做过DLL,都会很清楚_declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C+的类的话,你无法在DEF里指定导出的函数,只能用_declspec(dllexport)导出类。但是,MSDN文档里面,对于_declspec(dllimport)的说明让人感

34、觉有点奇怪,先来看看MSDN里面是怎么说的:不使用 _declspec(dllimport) 也能正确编译代码,但使用 _declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 _declspec(dllimport) 才能导入 DLL 中使用的变量。初看起来,这段话前面的意思是,不用它也可以正常使用DLL的导出库,但最后一句话又说,必须使用 _declspec(dllimport) 才能导入 D

35、LL 中使用的变量这个是什么意思?那我就来试验一下,假定,你在DLL里只导出一个简单的类,注意,我假定你已经在项目属性中定义了 SIMPLEDLL_EXPORTSimpleDLLClass.h#ifdef SIMPLEDLL_EXPORT#define DLL_EXPORT _declspec(dllexport)#else#define DLL_EXPORT#endifclass DLL_EXPORT SimpleDLLClasspublic:SimpleDLLClass();virtual SimpleDLLClass();virtual getValue() return m_nValu

36、e;private:int m_nValue;SimpleDLLClass.cpp#include SimpleDLLClass.hSimpleDLLClass:SimpleDLLClass()m_nValue=0;SimpleDLLClass:SimpleDLLClass()然后你再使用这个DLL类,在你的APP中include SimpleDLLClass.h时,你的APP的项目不用定义 SIMPLEDLL_EXPORT 所以,DLL_EXPORT 就不会存在了,这个时候,你在APP中,不会遇到问题。这正好对应MSDN上说的_declspec(dllimport)定义与否都可以正常使用。但

37、我们也没有遇到变量不能正常使用呀。那好,我们改一下SimpleDLLClass,把它的m_nValue改成static,然后在cpp文件中加一行int SimpleDLLClass:m_nValue=0;如果你不知道为什么要加这一行,那就回去看看C+的基础。 改完之后,再去LINK一下,你的APP,看结果如何,结果是LINK告诉你找不到这个m_nValue。明明已经定义了,为什么又没有了?肯定是因为我把m_nValue定义为static的原因。但如果我一定要使用Singleton的Design Pattern的话,那这个类肯定是要有一个静态成员,每次LINK都没有,那不是完了? 如果你有Pla

38、tform SDK,用里面的Depend程序看一下,DLL中又的确是有这个m_nValue导出的呀。再回去看看我引用MSDN的那段话的最后一句。 那我们再改一下SimpleDLLClass.h,把那段改成下面的样子:#ifdef SIMPLEDLL_EXPORT#define DLL_EXPORT _declspec(dllexport)#else#define DLL_EXPORT _declspec(dllimport)#endif再LINK,一切正常。原来dllimport是为了更好的处理类中的静态成员变量的,如果没有静态成员变量,那么这个_declspec(dllimport)无所谓。

39、_declspec(dllexport)与_declspec(dllimport) 都是DLL内的关键字,即导出与导入。他们是将DLL内部的类与函数以及数据导出与导入时使用的。主要区别在于,dllexport是在这些类、函数以 及数据的申明的时候使用。用过表明这些东西可以被外部函数使用,即(dllexport)是把DLL中的相关代码(类,函数,数据)暴露出来为其他应用程 序使用。使用了(dllexport)关键字,相当于声明了紧接在(dllexport)关键字后面的相关内容是可以为其他程序使用的。而dllimport关键字是在外部程序需要使用DLL内相关内容时使用的关键字。当一个外部程序要使用

40、DLL内部代码(类,函数,全局变量)时,只需要在 程序内部使用(dllimport)关键字声明需要使用的代码就可以了,即(dllimport)关键字是在外部程序需要使用DLL内部相关内容的时候才 使用。(dllimport)作用是把DLL中的相关代码插入到应用程序中。 _declspec(dllexport)与_declspec(dllimport)是相互呼应,只有在DLL内部用dllexport作了声明,才能 在外部函数中用dllimport导入相关代码。实际上,在应用程序访问DLL时,实际上就是应用程序中的导入函数与DLL文件中的导出函数进行链接。而 且链接的方式有两种:隐式迎接和显式链接

41、。隐式链接是指通过编译器提供给应用程序关于DLL的名称和DLL函数的链接地址,面在应用程序中不需要显式地将DLL加载到内存,即在应用程序中使用dllimport即表明使用隐式链接。不过不是所有的隐式链接都使用dllimport。显式链接刚同应用程序用语句显式地加载DLL,编译器不需要知道任何关DLL的信息以下是一个DLL头文件的正规编写方式: 1 #ifdef DIALOG_MAINMENU_EXPORTS 2 #define DIALOG_MAINMENU_API _declspec(dllexport) 3 #else 4 #define DIALOG_MAINMENU_API _decl

42、spec(dllimport) 5 #endif 6 7 class Dialog_MainMenu 8 public: 9 static DIALOG_MAINMENU_API enum GAME_STATES 10 MAINMENU, GAME, OPTIONS, CREDITS, QUIT11 ;12 static DIALOG_MAINMENU_API GAME_STATES CurrentGameState;13 DIALOG_MAINMENU_API GAME_STATES GetState();14 ;以下是解释:OK - when you compile the dll - y

43、ou are exporting the types. So, you need todefinethe static member in.cppfile of the dll. You also need to make sure that you have enabled the definition ofDIALOG_MAINMENU_EXPORTSin compiler settings. This will make sure types are exported.Now, when you link the console application with the dll - yo

44、u will#includedlls header and dont enable any definition ofDIALOG_MAINMENU_EXPORTSin compiler settings (just leave the settings default). This will make the compiler understand that now you are importing the typesfromyour dll into exeapplication.C/C+中动态链接库的创建和调用2007-02-05 14:12天极网我要评论(0)字号:T|T本文详细介绍

45、了动态连接库的创建步骤和动态链接的调用步骤,供大家参考!AD:【线下活动】三大新锐HTML 5企业汇聚51CTO大话移动前端技术动态连接库的创建步骤:一、创建Non-MFC DLL动态链接库1、打开File New Project选项,选择Win32 Dynamic-Link Library sample project 工程名:DllDemo2、新建一个.h文件DllDemo.h#ifdefDllDemo_EXPORTS #defineDllAPI_declspec(dllexport) #else #defineDllAPI_declspec(dllimport) externC/原样编译

46、 DllAPIint_stdcallMax(inta,intb);/_stdcall使非C/C+语言内能够调用API #endif3、在DllDemo.cpp文件中导入DllDemo.h文件,并实现Max(int,int)函数#includeDllDemo.h DllAPIint_stdcallMax(inta,intb) if(a=b) returnNULL; elseif(ab) returna; else returnb; 4、编译程序生成动态连接库二、用.def文件创建动态连接库DllDemo.dll1、删除DllDemo工程中的DllDemo.h文件。2、在DllDemo.cpp文件

47、头,删除 #include DllDemo.h语句。3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句:LIBRARY MyDllEXPORTSMax14、编译程序生成动态连接库。动态链接的调用步骤:一、隐式调用1、建立DllCnslTest工程2、将文件DllDemo.dll、DllDemo.lib拷贝到DllCnslTest工程所在的目录3、在DllCnslTest.h中添加如下语句:#defineDllAPI_declspec(dllimport) #pragmacomment(lib,DllDemo.lib)/在编辑器link时,链接到DllDemo.lib文件

48、 externC DllAPIint_stdcallMax(inta,intb); 4、在DllCnslTest.cpp文件中添加如下语句:#includeDllCnslTest.h/或者#includeDllDemo.h voidmain() intvalue; value=Max(2,9); printf(TheMaxvalueis%dn,value); 5、编译并生成应用程序DllCnslTest.exe二、显式调用1、建立DllWinTest工程。2、将文件DllDemo.dll拷贝到DllWinTest工程所在的目录或Windows系统目录下。3、用vc/bin下的Dumpbin.e

49、xe的小程序,查看DLL文件(DllDemo.dll)中的函数结构。4、使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针。例:typedefint(*lpMax)(inta,intb);/此语句可以放在.h文件中5、通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄。例:HINSTANCEhDll;/声明一个Dll实例文件句柄 hDll=LoadLibrary(DllDemo.dll);/导入DllDemo.dll动态连接库6、通过GetProcAddress()函数获取导入到应用程序中的函数指针。例:lpMaxMax; Max=(lpMax)GetProcAddress(hDLL,Max); intvalue; value=Max(2,9); printf(TheMaxvalueis%d,value);7、函数调用完毕后,使用FreeLibrary()卸载DLL文件。FreeLibrary(hDll);8、编译并生成应用程序DllWinTest.exe

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!