Visual C++ 6.0静态、动态链接库

1.什么是静态连接库,什么是动态链接库          静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。静态链接库与静态链接库调用规则总体比较如下。

对于静态链接库(比较简单): 首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。
生成库的.h头文件中的声明格式如下: extern "C" 函数返回类型 函数名(参数表); 在调用程序的.cpp源代码文件中如下:

#include "..\lib.h"

#pragma comment(lib,"..\\debug\\libTest.lib") //指定与静态库一起链接
第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)

 

对于动态链接库: 动态链接库的使用,根据不同的调用方法,需要提供不同的资源:

1. 静态加载------程序静态编译的时候就静态导入dll,这样的话就需要提供给库使用者(C客户)如下文件:*.lib文件和.dll文件和*.h。其有2个坏处:

    1   程序一开始运行就需要载入整个dll,无法载入程序就不能开始运行;     2   由于载入的是整个dll,需要耗费资源较多

其调用方法如下:

#include "..\lib.h"

#pragma comment(lib,"..\\debug\\libTest.lib")

  但是这种方式的话可以调用Class method.

2.动态加载-----那么只需要提供dll文件。

因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。但是无法调用Class method了。 如果要调用Dll中的function,需要经历3个步骤: Handle h=LoadLibrary(dllName) --> GetProcAddress(h,functionName) 返回函数指针,通过函指针调用其function-->FreeLibrary(h) 例如:Another.dll有一个int Add(int x,int y)函数。则完整的调用过程如下: typedef int (* FunPtr)(int,int);//定义函数指针

FunPtr funPtr; Handle h=LoadLibrary("Another.dll");

funPtr=(FunPtr)GetProcAddress(h,"Add");

funPtr(2,3);//2+3; FreeLibrary(h);

 

 

 

2.示例 示例之一: 静态链接库的创建过程: 例如:我们创建一个自定义字符串的类CHironString, 只需要在IDE里面添加class即可,然后program相应函数体 代码如下所示: SDLL.h文件 ------------------------------------------------------------------------ // HironString.h: interface for the CHironString class. // //////////////////////////////////////////////////////////////////////

#if !defined(AFX_HIRONSTRING_H__B23C5E5E_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 * 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_)

SDLL.CPP如下: -------------------------------------------------------------- // HironString.cpp: implementation of the CHironString class. // //////////////////////////////////////////////////////////////////////

#include "stdafx.h" #include "HironString.h"

////////////////////////////////////////////////////////////////////// // Construction/Destruction //////////////////////////////////////////////////////////////////////

CHironString::CHironString() {  m_data=NULL; }

CHironString::CHironString(char * str) {  int len=strlen(str);  m_data=new char[len+1];  strcpy(m_data,str);

}

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 char[len];  strcpy(m_data,other.m_data); }

CHironString& 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 char[len];  strcpy(m_data,other.m_data);  return *this; }

char * CHironString::GetData() {  return m_data; }

然后,将程序编译后生成sdll.lib。 客户调用:将CHironString.h和SDLL.lib发布给client,那么客户端就可以调用我们编写的静态链接库了。
示例之二: 动态链接库的创建


首先我们必须先注意到DLL内的函数分为两种: (1)DLL 导出函数,可供应用程序调用; (2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。

我们还是创建一个自定义的字符串处理类CHironString,不同之处其是一个动态链接库Dll。 动态链接库的export 需要在在相应的头文件中编写相应的MACRO MyDll.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 definition中,这个MACRO表明其要定义一个导出宏

CHironString.h 自定义类头文件 ---------------------------------------------------------------- // HironString.h: interface for the CHironString class. // //////////////////////////////////////////////////////////////////////

#if !defined(AFX_HIRONSTRING_H__518E9EC4_0837_4E45_9516_7D6A70CD3D0F__INCLUDED_) #define 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 Class { private:

 char* m_data; public:  char * GetData();  CHironString(CHironString &other);  int Length();    CHironString();  CHironString(char * str);  CHironString& operator=(CHironString &other);  virtual ~CHironString();

};

#endif // !defined(AFX_HIRONSTRING_H__518E9EC4_0837_4E45_9516_7D6A70CD3D0F__INCLUDED_)

 CHironString.Cpp ------------------------------------------------------------

// HironString.cpp: implementation of the CHironString class. // //////////////////////////////////////////////////////////////////////

#include "stdafx.h" #include "HironString.h"

////////////////////////////////////////////////////////////////////// // Construction/Destruction //////////////////////////////////////////////////////////////////////

CHironString::CHironString() {  m_data=NULL; }

CHironString::CHironString(char * str) {  int len=strlen(str);  m_data=new char[len+1];  strcpy(m_data,str);

}

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 char[len];  strcpy(m_data,other.m_data); }

CHironString& 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 char[len];  strcpy(m_data,other.m_data);  return *this; }

char * CHironString::GetData() {  return m_data; }

经过compile之后,会生成MyDll.dll和MyDll.lib文件。
客户端的调用: 1.如果是静态加载,那么需要提供*.lib和*.h,运行时候需提供*.dll

2.如果是动态加载,只需要提供*.dll即可。

 

 

 

时间: 2024-12-03 01:47:40

Visual C++ 6.0静态、动态链接库的相关文章

关于Visual C++ 6.0的调试技巧和经验总结

用VC来写程序,有时总是出这样那样的问题,没办法只能自己上网查资料来解决,在这里把自己常见的问题和一些技巧贴出来分享给大家,希望对大家有用,也省去大家再去搜索的烦恼--     1.如何在Release状态下进行调试     Project->Setting=>ProjectSetting对话框,选择Release状态.C/C++标签中的Category选General,Optimizations选Disable(Debug),Debut info选Program Database.在Link

visual foxpro 7.0漫谈

今年是开发工具集中更新版本的一年:微软的Visual Studio.Net,Borland 的Delphi 6.Sybase的Power Builder 8都相继推出正式版或是测试版,我们的Visual FoxPro 当然也不会放过这业界大比武的好时机,今年5月微软发布了Visual FoxPro 7,它是继1995年Fox家族第一个可视化成员Visual FoxPro 3以来最具革命意义的版本. "革命意义"这个词可不是我信口开河.随便使用的,这是国外的Fox社区对Visual Fo

关于Visual Basic 9.0的动态标识符

动态语言今年来发展很快,各种脚本语言多少都带有些动态语言的特点.动态语言以其灵活的语法和丰富的运行时行为赢得了许多人的青睐.在.NET阵营,C#一直扮演着静态语言的角色,尽管3.0的语法改变很激进,但仍注重于编译时的类型检查和约束.动态特性用的不好会产生更多运行时问题,不易确保程序的可靠性,但其提高开发效率的作用是毋庸置疑的.Visual Basic 9.0是Visual Studio中唯一能让你统领动态和静态两大领域的语言,让你在程序中自由选择喜欢的风格. Visual Basic 从1.0便

如何创建和使用Linux静态/动态链接库

和Windows系统一样Linux也有静态/动态链接库,下面介绍创建和使用方法: 假设有下面几个文件: 头文件String.h,声明相关函数原形,内容如下: Strlen.c:函数Strlen的实现,获取给定字符串的长度,内容如下: Strlnen.c:函数StrNlen的实现,获取给定字符串的长度,如果输入字符串的长度大于指定的最大长度,则返回最大长度,否者返回字符串的实际长度,内容如下: 生成静态库: 利用GCC生成对应目标文件: gcc –c Strlen.c Strnlen.c 如果对应

《圣殿祭司的ASP.NET4.0专家技术手册》----2-3 C# 4.0静态基础融入动态能力

2-3 C# 4.0静态基础融入动态能力 圣殿祭司的ASP.NET4.0专家技术手册 在了解静态与动态语言后,大家直觉上可能会以为这是二元的对立,非黑即白,不是静态语言,就是动态语言.但您是否想过静态和动态之间是可以兼具或混合的可能性?例如,静态语言为获取动态语言优点,而融入了一些动态语言的功能,然后又保持静态语言的优势,如类型安全.优化.高效率. 是的,.NET 4.0正是以这个方向去改造,在原本C#.VB静态语言基础上,加上动态语言的一些特性与优势,这样就达到以静态为主,动态为辅之目的,让C

《Visual C++ 开发从入门到精通》——第1章 Visual C++ 6.0的最初印象1.1 Visual C++ 6.0概述

1.1 Visual C++ 6.0概述 知识点讲解:光盘视频PPT讲解(知识点)第1章Visual C++ 6.0介绍.mp4 Visual C++ 6.0是一个强大的可视化软件开发环境,通过它可以快速编写出各种C/C++程序.从数据库应用程序到网络应用程序,从图形.图像绘制到多媒体编程,从基本的对话框.单文档.多文档应用程序到动态链接库,再到ActiveX控件.总之,通过Visual C++ 6.0这一工具,可以实现上述各类程序. 1.1.1 Visual C++ 6.0的特点Visual

转msdn: Visual InterDev 6.0 versus FrontPage 2000: Your Choice [2]

frontpage|interdev|visual       Figure 6: The Project Deployment Explorer         Visual InterDev also contains the Document Outline page and the Project Deployment Explorer. You can control a site from this Explorer, and change deployment mode in a

转msdn: Visual InterDev 6.0 versus FrontPage 2000: Your Choice [1]

frontpage|interdev|visual Visual InterDev 6.0 versus FrontPage 2000: Your Choice Alexander Maltsev   Visual InterDev 6.0 and FrontPage 2000 are two tools used by Web professionals, but they offer complementary functions. The best one to choose depend

Visual Basic 6.0 控件和 .NET 控件的区别

visual|控件|区别 Visual Basic 6.0 控件和 .NET 控件的区别 摘要:本文简单介绍了 Microsoft Visual Basic 6.0 中的标准控件和等效的 Microsoft .NET 控件. 目标 了解哪些 Visual Basic 6.0 ActiveX 控件在 .NET 中具有等效控件. 了解 .NET 控件中哪些属性发生了变化. 了解 .NET 中有哪些新控件. 前提条件 要彻底理解本文内容,需要满足以下条件: 了解什么是 ActiveX 控件. 使用 V