静态链接库LIB和动态链接库DLL的区别 创建和示例_第1页
静态链接库LIB和动态链接库DLL的区别 创建和示例_第2页
静态链接库LIB和动态链接库DLL的区别 创建和示例_第3页
静态链接库LIB和动态链接库DLL的区别 创建和示例_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、静态链接库LIB和动态链接库DLL的区别 创建和示例    静态链接库LIB和动态链接库DLL的区别 创建和示例 2009-05-10 17:00            1.什么是静态连接库,什么是动态链接库         静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE

2、文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接 库。静态链接库与静态链接库调用规则总体比较如下。     对于静态链接库(比较简单):首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。生成库的.h头文件中的声明格式如下:extern "C" 函数返回类型 函数名(参数

3、表);在调用程序的.cpp源代码文件中如下:#include ".lib.h"#pragma comment(lib,".debuglibTest.lib") /指定与静态库一起链接第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)    对于动态链接库:动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。首先我们必须先注意到DLL内的函数分为两种:

4、 (1)DLL 导出函数,可供应用程序调用; (2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。2.示例示例之一:静态链接库的创建过程:例如:我们创建一个自定义字符串的类CHironString,只需要在里面添加即可,然后相应函数体代码如下所示:SDLL.h文件-/ HironString.h: interface for the CHironString class./    #if !defined(AFX_HIRONSTRING_H_B23C

5、5E5E_0E8B_4030_B057_34A40C934C59_INCLUDED_)#define AFX_HIRONSTRING_H_B23C5E5E_0E8B_4030_B057_34A40C934C59_INCLUDED_    #if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000    class CHironString private:    char* m_data;public:char

6、* GetData();CHironString(CHironString &other);int Length();CHironString();CHironString(char * str);CHironString& operator=(CHironString &other);virtual CHironString();    #endif / !defined(AFX_HIRONSTRING_H_B23C5E5E_0E8B_4030_B057_34A40C934C59_INCLUDED_)  &#

7、160; SDLL.CPP如下:-/ HironString.cpp: implementation of the CHironString class./    #include "stdafx.h"#include "HironString.h"    / Construction/Destruction/    CHironString:CHironString()m_data=NULL;  

8、0; CHironString:CHironString(char * str)int len=strlen(str);m_data=new charlen+1;strcpy(m_data,str);        CHironString:CHironString()delete m_data;    int CHironString:Length()return strlen(m_data);    CHironStrin

9、g:CHironString(CHironString &other)int len=strlen(other.m_data)+1;m_data=new charlen;strcpy(m_data,other.m_data);    CHironString& CHironString:operator =(CHironString &other)if(this=&other)   return *this;if(m_data!=NULL)   delete m_data;int l

10、en=strlen(other.m_data)+1;m_data=new charlen;strcpy(m_data,other.m_data);return *this;    char * CHironString:GetData()return m_data;    然后,将程序编译后生成sdll.lib。客户调用:将CHironString.h和SDLL.lib发布给client,那么客户端就可以调用我们编写的静态链接库了。示例之二:动态链接库的创建我们还是创建一个自定义的字符串处理类CHironStrin

11、g,不同之处其是一个动态链接库Dll。动态链接库的export 需要在在相应的头文件中编写相应的MACROMyDll.h:自定义了一些类(函数)export 宏(该文件由IDE自动生成)如下-#ifdef MYDLL_EXPORTS#define MYDLL_API _declspec(dllexport)#else#define MYDLL_API _declspec(dllimport)#endif这是导出类的宏定义,将导出类必须加上该宏,才能被导出。此处的MYDLL_EXPORTS会出现在 project->settings->C/C+页面上的 PreProcessor de

12、finition中,这个MACRO表明其要定义一个导出宏CHironString.h 自定义类头文件-/ HironString.h: interface for the CHironString class./    CHironString.Cpp-    / HironString.cpp: implementation of the CHironString class./    #include "stdafx.h"#include "

13、HironString.h"     / Construction/Destruction/    CHironString:CHironString()m_data=NULL;    CHironString:CHironString(char * str)int len=strlen(str);m_data=new charlen+1;strcpy(m_data,str);       

14、60;CHironString:CHironString()delete m_data;    int CHironString:Length()return strlen(m_data);    CHironString:CHironString(CHironString &other)int len=strlen(other.m_data)+1;m_data=new charlen;strcpy(m_data,other.m_data);    CHironStr

15、ing& CHironString:operator =(CHironString &other)if(this=&other)   return *this;if(m_data!=NULL)   delete m_data;int len=strlen(other.m_data)+1;m_data=new charlen;strcpy(m_data,other.m_data);return *this;    char * CHironString:GetData()return m_da

16、ta;    经过compile之后,会生成MyDll.dll和MyDll.lib文件。客户端的调用:将MyDll.dll和MyDll.lib和CHironString交由client即可。notes:如果要调用Dll中的function,需要经历3个步骤:Handle h=LoadLibrary(dllName) -> GetProcAddress(h,functionName) 返回函数指针,通过函指针调用其function->FreeLibrary(h)例如:Another.dll有一个int Add(int x,int y)函数。则完

17、整的调用过程如下:typedef int (* FunPtr)(int,int);/定义函数指针FunPtr funPtr;Handle h=LoadLibrary("Another.dll");funPtr=(FunPtr)GetProcAddress(h,"Add");funPtr(2,3);/2+3;FreeLibrary(h);     #if !defined(AFX_HIRONSTRING_H_518E9EC4_0837_4E45_9516_7D6A70CD3D0F_INCLUDED_)#define

18、AFX_HIRONSTRING_H_518E9EC4_0837_4E45_9516_7D6A70CD3D0F_INCLUDED_    #if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000#include "MyDll.h"    class MYDLL_API CHironString   /加上MYDLL_API表明此为Export Classprivate:    char* m_data;public:char * GetData();CHironString(

温馨提示

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

评论

0/150

提交评论