当前位置:文档之家› 演练:创建和使用动态链接库

演练:创建和使用动态链接库

演练:创建和使用动态链接库
演练:创建和使用动态链接库

创建和使用动态链接库(C++)

Visual Studio 2008

其他版本

使用动态链接代替静态链接有若干优点。DLL 节省内存,减少交换操作,节省磁盘空间,更易于升级,提供售后支持,提供扩展MFC 库类的机制,支持多语言程序,并使国际版本的创建轻松完成。

在本演练中,您将创建一个动态链接库(DLL),其中包含可供其他应用程序使用的有用例程。使用DLL 是一种重用代码的绝佳方式。您不必在自己创建的每个程序中重新实现这些例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可。

我们将创建的第一种类型的库是动态链接库(DLL)。使用DLL 是一种重用代码的绝佳方式。您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可。

本演练涵盖以下内容:

?创建新的动态链接库(DLL) 项目。

?向动态链接库添加类。

?创建引用动态链接库的应用程序。

?在控制台应用程序中使用类库的功能。

?运行应用程序。

先决条件

本主题假定您具备C++ 语言的基础知识。

创建新的动态链接库(DLL) 项目

1.从“文件”菜单中,选择“新建”,然后选择“项目…”。

2.在“项目类型”窗格中,选择“Visual C++”下的“Win32”。

3.在“模板”窗格中,选择“Win32 控制台应用程序”。

4.为项目选择一个名称,如“MathFuncsDll”,并将其键入“名称”字段。为解决方案选择一个名

称,如“DynamicLibrary”,并将其键入“解决方案名称”字段。

5.单击“确定”启动Win32 应用程序向导。在“Win32 应用程序向导”对话框的“概述”页中,单击

“下一步”。

6.在“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果可

用),或者选择“控制台应用程序”(如果“DLL”不可用)。某些版本的Visual Studio 不支持通过使用向导创建DLL 项目。您可以稍后对此进行更改,以将项目编译为DLL。

7.在“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”。

8.单击“完成”创建项目。

向动态链接库添加类

1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。将显示“添加新项”对话框。在

“类别”窗格中,选择“Visual C++”下的“代码”。在“模板”窗格中选择“头文件(.h)”。为头文件选择一个名称,如“MathFuncsDll.h”,并单击“添加”。将显示一个空白文件。

2.添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。代码

应与以下内容类似:

复制

// MathFuncsDll.h

namespace MathFuncs

{

class MyMathFuncs

{

public:

// Returns a + b

static __declspec(dllexport) double Add(double a, double b);

// Returns a - b

static __declspec(dllexport) double Subtract(doubl

e a, double b);

// Returns a * b

static __declspec(dllexport) double Multiply(doubl

e a, double b);

// Returns a / b

// Throws DivideByZeroException if b is 0

static __declspec(dllexport) double Divide(double a, double b);

};

}

3.请注意此代码方法声明中的__declspec(dllexport) 修饰符。这些修饰符使DLL 能够导出

该方法以供其他应用程序使用。有关更多信息,请参见dllexport, dllimport。

4.若要为新类创建源文件,请从“项目”菜单中选择“添加新项…”。将显示“添加新项”对话框。在

“类别”窗格中,选择“Visual C++”下的“代码”。在“模板”窗格中,选择“C++ 文件(.cpp)”。为源文件选择一个名称,如“MathFuncsDll.cpp”,并单击“添加”。将显示一个空白文件。

5.在源文件中实现“MyMathFuncs”的功能。代码应与以下内容类似:

复制

// MathFuncsDll.cpp

// compile with: /EHsc /LD

#include "MathFuncsDll.h"

#include //标准异常类

using namespace std;

namespace MathFuncs

{

double 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 be zero!

");

}

return a / b;

}

}

6.若要将项目生成为DLL,请从“项目”菜单中选择“MathFuncsDll,再选择“属性…”。在左窗格

中,选择“配置属性”下的“常规”。在右窗格中,将“配置类型”更改为“动态库(.dll)”。单击“确定”

保存更改。

说明:

7.编译该动态链接库,方法是选择“生成”菜单中的“生成解决方案”。这样就创建了一个可供其

他程序使用的DLL。有关DLL 的详细信息,请参见DLL。

创建引用动态链接库的应用程序

1.若要创建将引用并使用刚创建的动态链接库的应用程序,请从“文件”菜单中选择“新建”,然

后选择“项目...”。

2.在“项目类型”窗格中,选择“Visual C++”下的“Win32”。

3.在“模板”窗格中,选择“Win32 控制台应用程序”。

4.为项目选择一个名称(如“MyExecRefsDll”),并将其键入“名称”字段。从“解决方案”旁边的

下拉列表中选择“添入解决方案”。这会将新项目添加到该动态链接库所属的同一个解决方案

中。

5.单击“确定”启动“Win32 应用程序向导”。在“Win32 应用程序向导”对话框的“概述”页中,单

击“下一步”。

6.在“Win32 应用程序向导”的“应用程序设置”页中,选择“应用程序类型”下的“控制台应用程序”。

7.在“Win32 应用程序向导”的“应用程序设置”页中,清除“附加选项”下的“预编译头”复选框。

8.按“完成”创建项目。

在控制台应用程序中使用类库的功能

1.创建新的控制台应用程序后,将为您创建一个空程序。源文件的名称与您在前面为项目选择

的名称相同。在本示例中,名为“MyExecRefsDll.cpp”。

2.若要使用在动态链接库中创建的算术例程,则必须引用该库。为此,请选择“项目”菜单中的“引

用…”。在“属性页”对话框中展开“通用属性”节点,选择“引用”,然后选择“添加新引用...”按钮。

有关“引用...”对话框的更多信息,请参见“ 属性页”对话框 ->“通用属

性”->“框架和引用”。

3.显示“添加引用”对话框。此对话框列出了所有可以引用的库。“项目”选项卡列出了当前解决

方案中的所有项目,以及它们包含的所有库。在“项目”选项卡中,选择“MathFuncsDll”。然

后单击“确定”。有关“添加引用”对话框的更多信息,请参见“添加引用”对话框。

4.若要引用动态链接库的头文件,必须修改包含目录路径。为此,请在“属性页”对话框中展开“配

置属性”节点,然后展开“C/C++”节点,并选择“常规”。在“附加包含目录”旁边,键入

“MathFuncsDll.h”头文件所在位置的路径。

5.可执行文件仅在运行时加载动态链接库。必须告诉系统在哪里查找“MathFuncsDll.dll”。您可

以通过使用PATH环境变量做到这一点。为此,请在“属性页”对话框中展开“配置属性”节点,并选择“调试”。在“环境”旁边键入以下内容:PATH=,其中 应替换为“MathFuncsDll.dll”的实际位置。单击“确定”保存所有更改。

说明:

6.现在,可以在应用程序中使用“MyMathFuncs”类了。使用以下代码替换“MyExecRefsDll.cpp”

的内容:

复制

// MyExecRefsDll.cpp

// compile with: /EHsc /link MathFuncsDll.lib

#include

#include "MathFuncsDll.h"

using namespace std;

int main()

{

double a = 7.4;

int b = 99;

cout << "a + b = " <<

MathFuncs::MyMathFuncs::Add(a, b) << endl;

cout << "a - b = " <<

MathFuncs::MyMathFuncs::Subtract(a, b) << endl;

cout << "a * b = " <<

MathFuncs::MyMathFuncs::Multiply(a, b) << endl;

cout << "a / b = " <<

MathFuncs::MyMathFuncs::Divide(a, b) << endl;

return 0;

}

7.通过从“生成”菜单中选择“生成解决方案”,生成可执行文件。

运行应用程序

1.确保选择“MyExecRefsDll”作为默认项目。在“解决方案资源管理器”中,选择“MyExecRefsDll”,

然后选择“项目”菜单中的“设为启动项目”。

2.若要运行项目,请选择“调试”菜单中的“开始执行(不调试)”。输出应该与下面的内容类似:

复制

a +

b = 106.4

a -

b = -91.6

a *

b = 732.6

a /

b = 0.0747475

C C++动态链接库的创建与调用

C/C++中动态链接库的创建和调用 1.动态链接库的创建步骤: 创建Non-MFC DLL动态链接库 1.打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project —>工程名:DllDemo 2.新建一个.h文件DllDemo.h 并添加如下代码: #ifdef DllDemo_EXPORTS #define DllAPI _declspec(dllexport) #else #define DllAPI _declspec(dllimport) extern “C” // 原样编译 { DllAPI int _stdcall Max(int a,int b); //_stdcall使非C/C++语言内能够调用API } #endif 3.新建一个.cpp文件,并添加如下代码 #include "DllDemo.h" DllAPI int __stdcall Max(int a,int b) { if(a==b) return NULL; else if(a>b) return a; else return b; } 4.编译程序生成动态链接库 1.2 用.def文件创建动态连接库DllDemo.dll 1、删除DllDemo工程中的DllDemo.h文件。 2、在DllDemo.cpp文件头,删除#include DllDemo.h语句。 3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句: LIBRARY MyDll EXPORTS Max@1 4、编译程序生成动态连接库。 2.动态链接库的调用步骤 2.1 隐式调用 1.建立DllCnsTest工程 2.将文件DllDemo.dll、DllDemo.lib拷贝到DllCnsTest工程所在的目录 3.在DllCnsTest中添加如下语句: #define DllAPI _declspec(dllimport) #pragma comment(lib,”DllDemo.lib”) extern “C” { DllAPI int _stdcall Max(int a,int b);

VC++动态链接库创建和调用全过程详解

1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 对动态链接库,我们还需建立如下概念: (1)DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。 (2)动态链接库随处可见 我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。 一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。 (3)VC动态链接库的分类 Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。 非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。 由于本文篇幅较长,内容较多,势必需要先对阅读本文的有关事项进行说明,下面以问答形式给出。 问:本文主要讲解什么内容? 答:本文详细介绍了DLL编程的方方面面,努力学完本文应可以对DLL有较全面的掌握,并能编写大多数DLL程序。 问:如何看本文? 答:本文每一个主题的讲解都附带了源代码例程,可以随文下载(每个工程都经WINRAR压缩)。所有这些例程都由笔者编写并在VC++6.0中调试通过。

VC++ MFC DLL动态链接库编写详解

VC++ MFC DLL动态链接库编写详解(2008-07-10 17:38:40) 标签:it分类:com技术然能用DLL实现的功能都可以用COM来替代,但DLL的优点确实不少,它更容易创建。本文将讨论如何利用VC MFC来创建不同类型的DLL,以及如何使用他们。 一、DLL的不同类型 使用VC++可以生成两种类型的DLL:MFC扩展DLL和常规DLL。常规DLL有可以分为动态连接和静态连接。Visual C++还可以生成WIN32 DLL,但不是这里讨论的主要对象。 1、MFC扩展DLL 每个DLL都有某种类型的接口:变量、指针、函数、客户程序访问的类。它们的作用是让客户程序使用DLL,MFC扩展DLL可以有C++的接口。也就是它可以导出C++类给客户端。导出的函数可以使用C++/MFC数据类型做参数或返回值,导出一个类时客户端能创建类对象或者派生这个类。同时,在DLL中也可以使用DLL和MFC。 Visual C++使用的MFC类库也是保存在一个DLL中,MFC扩展DLL动态连接到MFC代码库的DLL,客户程序也必须要动态连接到MFC代码库的DLL。(这里谈到的两个DLL,一个是我们自己编写的DLL,一个装MFC类库的DLL)现在MFC代码库的DLL也存在多个版本,客户程序和扩展DLL都必须使用相同版本的MFC代码DLL。所以为了让MFC扩展DLL能很好的工作,扩展DLL和客户程序都必须动态连接到MFC代码库DLL。而这个DLL必须在客户程序运行的计算机上。 2、常规DLL 使用MFC扩展DLL的一个问题就是DLL仅能和MFC客户程序一起工作,如果需要一个使用更广泛的DLL,最好采用常规DLL,因为它不受MFC的某些限制。常规DLL也有缺点:它不能和客户程序发送指针或MFC派生类和对象的引用。一句话就是常规DLL和客户程序的接口不能使用MFC,但在DLL和客户程序的内部还是可以使用MFC。 当在常规DLL的内部使用MFC代码库的DLL时,可以是动态连接/静态连接。如果是动态连接,也就是常规DLL需要的MFC代码没有构建到DLL中,这种情况有点和扩展DLL类似,在DLL运行的计算机上必须要MFC代码库的DLL。如果是静态连接,常规DLL里面已经包含了需要的MFC代码,这样DLL的体积将比较大,但它可以在没有MFC代码库DLL的计算机上正常运行。 二、建立DLL 利用Visual C++提供的向导功能可以很容易建立一个不完成任何实质任务的DLL,这里就不多讲了,主要的任务是如何给DLL添加功能,以及在客户程序中利用这个DLL 1、导出类 用向导建立好框架后,就可以添加需要导出类的.cpp .h文件到DLL中来,或者用向导创建C++ Herder File/C++ Source File。为了能导出这个类,在类声明的时候要加“_declspe c(dllexport)”,如:

演练:创建和使用动态链接库 (C++)

Visual C++ 指导教程 演练:创建和使用动态链接库(C++) Visual Studio 2010 其他版本 0(共1)对本文的评价是有帮助评价此主题 我们将创建的第一种类型的库是动态链接库(DLL)。使用DLL 是一种重用代码的绝佳方式。您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可。 本演练涵盖以下内容: ?创建新的动态链接库(DLL) 项目。 ?向动态链接库添加类。 ?创建引用动态链接库的应用程序。 ?在控制台应用程序中使用类库的功能。 ?运行应用程序。 系统必备 本主题假定您具备C++ 语言的基础知识。如果您是刚开始学习C++,建议您参阅Herb Schildt 编写的“C++ Beginner's Guide”(《C++ 初学者指南》),该书可从 https://www.doczj.com/doc/ea3520622.html,/fwlink/?LinkId=115303在线获得。 创建新的动态链接库(DLL) 项目 1.从“文件”菜单中,选择“新建”,然后选择“项目…”。 2.在“项目类型”窗格中,选择“Visual C++”下的“Win32”。 3.在“模板”窗格中,选择“Win32 控制台应用程序”。 4.为项目选择一个名称,如MathFuncsDll,并将其键入“名称”字段。为解决方案选择一个名 称,如DynamicLibrary,并将其键入“解决方案名称”字段。 5.单击“确定”启动Win32 应用程序向导。在“Win32 应用程序向导”对话框的“概述”页中, 单击“下一步”。

6.在“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果 可用),或者选择“控制台应用程序”(如果“DLL”不可用)。某些版本的Visual Studio 不支持通过使用向导创建DLL 项目。您可以稍后对此进行更改,以将项目编译为DLL。 7.在“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”。 8.单击“完成”创建项目。 向动态链接库添加类 1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。将显示“添加新项”对话框。 在“类别”窗格中,选择“Visual C++”下的“代码”。在“模板”窗格中选择“头文件(.h)”。为 头文件选择一个名称,如MathFuncsDll.h,并单击“添加”。将显示一个空白文件。 2.添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。代 码应与以下内容类似: 复制 // MathFuncsDll.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b static __declspec(dllexport) double Add(double a, double b); // Returns a - b static __declspec(dllexport) double Subtract(double a, dou ble b); // Returns a * b static __declspec(dllexport) double Multiply(double a, dou ble b); // Returns a / b // Throws DivideByZeroException if b is 0 static __declspec(dllexport) double Divide(double a, doubl e b); }; } 3.请注意此代码方法声明中的__declspec(dllexport)修饰符。这些修饰符使DLL 能够导出 该方法以供其他应用程序使用。有关更多信息,请参见dllexport, dllimport。

VC++ 2017 动态链接库的创建和使用总结

Visual studio c++ 2017 动态链接库的创建和使用总结 一动态链接库的创建两种方式: 1、只有从文件->新建->项目->Windows桌面-> Windows桌面向导->选择“动态链接 库(.dll)->生成解决方案,才会生成.dll和.lib文件。 (1)在头文件声明中(注意要在头文件变量和函数声明中,而不是在变量和函数的定义中声明),不加extern “C”修饰,编译成DLL后,用depends.exe查看导出函数名。 可以看出,导出的函数名都被编译器篡改了。

(2)在头文件声明中,变量和函数名前加extern “C”修饰后,编译成DLL后,再用depends.exe查看导出函数名。 可以看出,用extern “C”修饰的函数名,编译后函数名保持不变。类及成员函数不能用extern “C”修饰,编译成DLL后,成员函数名发生了改变。 2、如果从文件->新建->项目->动态链接库(DLL)->生成解决方案,就只生成.dll,不生成.lib。

二动态链接库的调用两种方式: 1、显式调用 (1)使用显式调用的前提:创建的DLL,编译时不要篡改函数名称,定义函数名时,可用extern “C”修饰函数名,保证编译时,函数名不被篡改。否则GetProcAddress( )不能正确地获取dll中的函数名。 但是导出的类不能使用extern “C”修饰。 (2)使用显式调用的优点:不用动态链接库的.h和.lib文件,只要有.dll文件就可调用库函数,使用LoadLibrary(),在需要调用.dll中的库函数时,才动态加载到内存中,使用完毕后,可以用FreeLibrary()释放内存中的dll;使用GetProcAddress( )获取dll中的函数名。必须事先知道dll中的函数名和形式参数。 (3)使用显式调用缺点:调用每个函数时,都必须使用 GetProcAddress( )获取dll中的函数名,并转换成原来的函数,比较麻烦。而隐式调用DLL函数,由于使用了DLL的头文件.h,使用起来非常方便。 2、隐式调用 (1)隐式调用DLL函数缺点: 应用程序加载时,在内存中载入DLL动用库中的函数、变量、或类。使用完毕后,DLL 也不会从内存中释放。 .lib包含了库函数的入口,但不包含函数代码,应用程序调用时,才从dll中载入。(2)隐式调用DLL函数优点: 应用程序调用dll时,需要.lib和.h文件,在应用程序.exe文件夹debug或者release 中有DLL文件,即.h、.lib和.dll三个文件,在应用程序中直接使用DLL中的类和函数,可以不考虑编译DLL函数和变量名发生改变的问题。不需要像显式调用那样,函数需要 用 GetProcAddress( )一一获取。 隐式调用DLL中的变量、函数和类,有两种方法: (1)在主程序中包含DLL的头文件dll.h,在main( )前加上#pragma comment(lib,”dll.lib”),没有分号,再在debug或release中复制DLL.dll。 (2)在主程序中包含DLL的头文件dll.h,在项目属性->链接器->添加依赖项中加上“dll.lib;“,再在debug或release中复制DLL.dll,即可。

(动态链接库)DLL编写与使用方法

DLL的创建与调用 1、DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。这些可以直接拿来使用。 静态链接库与动态链接库的区别: (1)静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的指令都包含在最终生成的EXE 文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。 (2)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 动态链接库的分类:Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。非MFC动态库不采用MFC 类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。 2、创建一个DLL 2.1 非MFC的DLL 2.1.1声明导出函数: extern “C” __declspec(dllexport) int add(int a, int b); 其中extern “C”为声明为C编译。由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。这样如果用C编译的程序来调用该dll中的函数时,可能会造成找不到该函数。 __declspec(dllexport)表示该函数为DLL输出函数,即其他应用程序可以调用该函数 从dll中声明输出函数有两种方式: (1)另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。 (2)用__declspec(dllexport)来声明函数 如果使用Visual C++来创建dll,对于同样用VC创建的exe来说,调用dll没有什么问题。而如果用其他工具来创建的exe来调用dll,就会出现问题。因为即使你不用C++编译器,Microsoft C编译器也会损害C函数。当用__stdcall将函数输出时,C编译器会将函数改为_func@1的形式。在这里需要在.def 文件中加入EXPORTS节来输出函数: EXPORTS func 这样,dll将用func函数名来输出函数。 另一种方式是用#pragma (linker, “/exports:func=_func@1”),告诉编译器输出函数func,这种方式没有前一种好。 如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++ 缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number;

vs2012建立和引用lib、dll简明教程

Vs2012建立引用lib、dll简明教程 一、基本概念 Lib——静态链接库用到的指令都被直接包含在exe文件中,程序运行的时候不再需要其它的库文件。静态共享代码 DLL——把调用的函数所在dll和函数所在位置信息链接至程序中,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。动态引用和卸载 二、vs2012建立和引用lib 建立lib 1.创建静态项选择win32控制台应用程序->输入项目名称->选择静态链接库->取消 默认预编译头->完毕。 2.编写库创建cpp和h文件,并编写内容。 3.编译,创建完成,新lib在输出路径(debug)中。 引用lib 1.创建工程略 2.编写程序略 3.在项目->属性->配置属性->vc++目录->包含目标中附加之前工程的头文件的目录 4.在引用->通用属性->框架和引用->添加引用->勾选相应目录->确定(lib项目和该项目在同一路径下时)。 或者在vc++目录->库目录中添加新lib的路径,在链接器->输入->附加依赖项中添加新lib。 5.完成。在编写程序时要加上头文件包含。 三、vs2012建立和引用dll 建立dll 1. 创建动态项选择win32控制台应用程序->输入项目名称->选择动态链接库->取消默认预编译头->完毕。

2. 编写库创建cpp和h文件,并编写内容。在h文件中对函数的声明时注意,对于该dll输出接口的函数要用__declspec(dllexport)声明,如 extern “C”__declspec(dllexport) int Add(int &a,int &b); 加extern“C”是为了解决因C编译器与C++编译器对函数声明的编译情况不同(c语言不支持重载),而导致的调用错误。如果已知在c++环境下调用,可不必加。 3. 引用dll同时需要lib文件,再在项目中添加一个def文件。 4. 编译生成,新dll和lib在输出路径(debug)中。 此处的lib存放的是dll的函数入口位置,与单纯静态链接库 lib不同。 引用dll 1.创建工程略 2.编写程序略 3.在项目->属性->配置属性->vc++目录->包含目标中附加dll的头文件的目录 4.在引用->通用属性->框架和引用->添加引用->勾选相应目录->确定(dll项目和该项目在同一路径下时) 或者在vc++目录->库目录中添加新lib的路径,在链接器->输入->附加依赖项中添加新lib。 5.完成。在编写程序时要加上头文件包含。

dll(动态链接库)的创建和使用

dll的创建和使用使用C++语言创建dll并使用该dll的演示、说明

Dll的创建和使用 第一部分创建C风格的dll (4) 步骤1:创建dll工程 (4) 步骤2:文件改名 (5) 步骤3:拷贝文件内容 (6) 步骤4:从工程中删掉文件main.cpp,main.h (7) 步骤5:继续修改文件mydll.h和mydll.cpp (7) 步骤6:编译并生成dll文件 (8) 第二部分以间接调用的方式使用.dll (10) 步骤1:新建一个控制台工程(UseDll.cbp). (10) 步骤2:修改main.cpp。 (11) 步骤3:编译,生成UseDll.exe (12) 步骤4:拷贝mydll.dll到UseDll.exe所在目录 (13) 步骤5:执行UseDll.exe,输出: (13) 间接调用Dll的好处 (14) 第三部分以直接调用的方式使用.dll (15) 步骤1:改写main.cpp (15) 步骤2:添加mydll.dll的静态导出库到UseDll工程中 (16) 步骤3:编译并执行,输出 (17) 直接调用的好处 (18) Dll的优势 (18) 调用约定的说明 (18) 第四部分创建C++风格的dll(本地方法) (19) 步骤1:在mydll.h中新增导出的类 (19) 步骤2:在mydll.cpp中实现Cat类 (19) 步骤3:编译MyDll,生成mydll.dll,mydll.a (21) 第五部分使用本地风格的C++ DLL (22) 步骤1:修改UseDll中的main.cpp (22) 步骤2:将mydll.a添加到UseDll工程的BuildOptions中 (23) 步骤3:编译UseDll工程,生成UseDll.exe (23) 步骤4:将MyDll.dll拷贝到UseDll.exe目录下 (23) 步骤5:执行UseDll.exe,输出 (23) 本地风格的不足 (24) 第六部分创建推荐风格的C++ DLL (26) 步骤1:修改mydll.h,创建Cat的接口类ICat (26) 步骤2:新建类Cat (27) 步骤3:实现createCat函数 (29) 步骤4:编译,生成mydll.dll (31) 第七部分使用推荐风格的C++ DLL (32) 步骤1:修改UseDll中的main.cpp (32)

C++ 动态库创建与调用

1、概述 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终 EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 2、静态库 对静态链接库的讲解不是本文的重点,但是在具体讲解DLL之前,通过一个静态链接库的例子可以快速地帮助我们建立“库”的概念。 在VC++6.0中new一个名称为libTest的static library工程(单击此处下载本工程附件),并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下: //文件:lib.h #ifndef LIB_H #define LIB_H extern "C" int add(int x,int y); //声明为C编译、连接方式的外部函数 #endif //文件:lib.cpp #include "lib.h" int add(int x,int y) { return x + y; } 编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。 下面来看看怎么使用这个库,在libTest工程所在的工作区内new一个libCall 工程。libCall工程仅包含一个main.cpp文件,它演示了静态链接库的调用方法,其源代码如下: #include #include "../lib.h" #pragma comment( lib, "..//debug//libTest.lib" ) //指定与静态库一起连接

在VS2017中创建和使用动态链接库DLL

在VS2017中创建和使用动态库DLL 一、在VS2017中创建DLL动态库 1、运行VS2017,选择:新建->项目->Visual C++ ->Windows桌面->动态库(DLL),选择保存项目位置, 输入项目名称(也是动态库的名称),确定。 2、给项目添加头文件:15MyDLL.h,

4、在头文件中,写入代码: #ifndef EXPORT_DLL//如果没有在项目配置属性->C/C++ ->预处理器定义了“EXPORT_DLL”#define EXPORT_API __declspec(dllimport) //宏定义__declspec(dllimport)为EXPORT_API,即为导入,从DLL 中导入到应用程序 #else//否则(如果在于处理器定义了EXPORT_DLL) #define EXPORT_API__declspec(dllexport) //EXPORT_API 被定义成导出__declspec(dllexport),从DLL中输出 变量、函数或类等 #endif// !EXPORT_DLL 添加全局变量、函数和类: extern EXPORT_API float const PII = 3.14159; //导出一个常变量,要赋初值,在头文件中,要用extern修饰为 全局变量, EXPORT_API float圆面积(float); //导出一个函数

public: 球体(); ~球体(); private: }; 给类添加变量: 给类添加成员函数:

5、生成DLL动态库: 注意:在*.cpp中,#include "stdafx.h"要在#include "15MyDLL.h"前面哦,不然会有一堆错误出现! #include "stdafx.h"在前,就没有出错。 6、将生成的DLL对应的*.dll、*.lib和*.h复制出来,拷贝到应用程序中项目中,导出相应的变量、函数和类。

VS2013创建dll动态链接库文件心得

VS2013创建dll动态链接库文件心得 关于创建动态链接库文件,并在程序运行过程中连接调用,我是这么理解的; 这篇文章基本是属于入门文档。。。 首先要生成一个DLL文件和lib文件,才能够供给其他程序动态调用或者静态调用。这篇日志是关于动态调用的; 接下来是总结的一些具体步骤: 1.新建项目,win32,win32项目,输入项目名称,例如:MakeDll。 2.确定,下一步: 3.菜单栏选择项目——添加新项,来创建头文件MakeDll.h。在MakeDll.h中输入以下例子代码: [cpp] view plaincopy#define DLL_API __declspec(dllexport) #include<iostream> using namespace std; DLL_API int add(int a, int b); class DLL_API Point { private: float x, y; public: Point(); void SetPoint(float a, float b); void DisPlay(); }; 4.创建MakeDll.cpp来实现MakeDll.h中的函数和类;在MakeDll.cpp中需要包含MakeDll.h头文件 步骤:右击项目——属性——配置属性——VC++目录——

可执行文件目录,在项目中找到MakeDll.h所在目录,包含以下就可以了在MakeDll.cpp中的代码如下: [cpp] view plaincopy#include<MakeDll.h> DLL_API int add(int a, int b) { return a + b; } Point::Point() { x = 0.0f; y = 0.0f; } void Point::SetPoint(float x, float y) { this->x = x; this->y = y; } void Point::Display() { cout << "x= " << x << endl; cout << "y= " << y << endl; } 5.菜单栏——生成——生成解决方案。 此时在MakeDll项目所在目录下的Debug目录下的文件有MakeDll.dll和MakeDll.lib了。生成动态链接库文件OK。接下来是动态调用; 6.新建项目——win32控制台应用程序,项目名称:UseDll,确定——下一步,勾上空项目。 7.将第一个项目中生成的MakeDll.dll和MakeDll.lib复制到UseDll\UseDll目录下。8.为了方便,将项目MakeDll中的MakeDll.h头文件也复制到本项目中,最好复制到 UseDll\UseDll目录中然后同样的,右击项目——属性,如同

vs2010创建和使用动态链接库(dll)

vs2010创建和使用动态链接库(dll) 1、打开Microsoft Visual Studio 2010,选择 File->New->Project。 2、在New Project中选择Installed Templates->Visual C++->Win32。 3、选择Win32 Console Application,设置名称:simpledll,设置解决方案名:zdddll。 4、单击OK,在出现的Win32 Application Wizard的Overview 对话框中点击Next。 5、在Application Settings中,选择Application type下的DLL。 6、勾选Additional options下的Empty project。 7、单击Finish创建项目。 向动态链接库添加类: 1、添加新类头文件。右键单击simpledll项目,Add->New Item,选择Header File(.h),设置名称为simpledll,单击Add。 2、添加新类源文件。右键单击simpledll项目,Add->New Item,选择C++ File(.cpp),设置名称为simpledll,单击Add。 3、为新类添加内容。内容如下: 头文件simpledll.h:

[html] view plain copy print?//------------------ simpledll.h ---------------- #pragma once; //该宏完成在dll项目内部使用__declspec(dllexport)导出//在dll项目外部使用时,用__declspec(dllimport)导入//宏DLL_IMPLEMENT在simpledll.cpp中定义#ifdef DLL_IMPLEMENT #define DLL_API __declspec(dllexport) #else #define DLL_API __declspec(dllimport) #endif namespace zdd { //导出类class DLL_API SimpleDll { public: SimpleDll(); ~SimpleDll(); int add(int x, int y); //简单方法}; } 源文件simpledll.cpp: [cpp] view plain copy print?//------------------ simpledll.cpp ---------------- //注意此处的宏定义需要写在#include "simpledll.h"之前//以完成在dll项目内部使用 __declspec(dllexport)导出//在dll项目外部使用时,用 __declspec(dllimport)导入#define DLL_IMPLEMENT #include "simpledll.h" namespace zdd { SimpleDll::SimpleDll() { } SimpleDll::~SimpleDll() { } int

C和C中动态链接库的创建和调用

动态连接库的创建步骤: 一、创建Non-MFC DLL动态链接库 1、打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project —>工程名:DllDemo 2 3、在 4、编译程序生成动态连接库 二、用.def文件创建动态连接库DllDemo.dll 1、删除DllDemo工程中的DllDemo.h文件。 2、在DllDemo.cpp文件头,删除 #include DllDemo.h语句。 3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句: LIBRARY MyDll EXPORTS Max@1

4、编译程序生成动态连接库。 动态链接的调用步骤: 一、隐式调用 1、建立DllCnslTest工程 2、将文件DllDemo.dll、DllDemo.lib拷贝到DllCnslTest工程所在的目录 3、在 4、在 5、编译并生成应用程序DllCnslTest.exe 二、显式调用 1、建立DllWinTest工程。 2、将文件DllDemo.dll拷贝到DllWinTest工程所在的目录或Windows系统目录下。 3、用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函数结构。 4、使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针。 例: 5、通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄。例:

6、通过GetProcAddress()函数获取导入到应用程序中的函数指针。例: 7 8、编译并生成应用程序DllWinTest.exe 注:显式链接应用程序编译时不需要使用相应的Lib文件。

Linux静态链接库动态链接库的创建和使用及区别

标题:Linux下静态、动态库(隐式、显式调用)的创建和使用及区别 一、静态链接库的创建与使用: 1、编写add.c 及main.c代码: /**************************************************************************/ /*add.c*/ int add(int x, int y) { return x + y; return 0; } /*************************************************************************/ 然后add.h代码为: /*add.h*/ #ifndef _ADD_H_ #define _ADD_H_ int add(int, int); #endif /***************************************************************************/ main函数代码: /*main.c*/ #include int main(void) { printf("2+3= %d\n", add(2,3)); return 0; } /****************************************************************************** ****/ 2、现在首先要明确我们目的是将add.c做成静态链接库,然后main.c调用生成的静态链接库中的add() (1)将add.c做成静态链接库(创建静态库): 首先将add.c编译成目标文件(add.o文件),如下: #gcc -c add.c //生成add.o 然后将生成的目标文件(add.o)生成静态库libadd.a: #ar crv libadd.a add.o //生成libadd.a (2)静态库做好了,就可以在编译main.c时将静态库链接进去了,接下来就编译生成可执行文件(静态库的使用): #gcc -o exe main.c -I. -L. -ladd

C中如何调用动态链接库DLL

C#中如何调用动态链接库DLL 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows 最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式实现。 动态链接库是不能直接执行的,也不能接收消息,它只是一个独立的文件,其中包含能被程序或其它DLL调用来完成一定操作的函数(方法。注:C#中一般称为“方法”),但这些函数不是执行程序本身的一部分,而是根据进程的需要按需载入,此时才能发挥作用。 DLL只有在应用程序需要时才被系统加载到进程的虚拟空间中,成为调用进程的一部分,此时该DLL也只能被该进程的线程访问,它的句柄可以被调用进程所使用,而调用进程的句柄也可以被该DLL所使用。在内存中,一个DLL只有一个实例,且它的编制与具体的编程语言和编译器都没有关系,所以可以通过DLL来实现混合语言编程。DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。 下面列出了当程序使用 DLL 时提供的一些优点:[1] 1) 使用较少的资源 当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在 Windows 操作系统上运行的程序。 2) 推广模块式体系结构 DLL 有助于促进模块式程序的开发。这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。 3) 简化部署和安装 当 DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。此外,如果多个程序使用同一个 DLL,那么多个程序都将从该更新或修复中获益。当您使用定期更新或修复的第三方 DLL 时,此问题可能会更频繁地出现。 每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍。首先,您需要了解什么是托管,什么是非托管。一般可以认为:非托管代码主要是基于win 32平台开发的DLL,activeX的组件,托管代码是基于.net平台开发的。如果您想深入了解托管与非托管的关系与区别,及它们的运行机制,请您自行查找资料,本文件在此不作讨论。 (一) 调用DLL中的非托管函数一般方法

五:动态链接库的建立与调用

实验五:动态链接库的建立与调用 1、实验目的 (1)理解动态链接库的实现原理。 (2)掌握Windows系统动态链接库的建立方法。 (3)掌握Windows环境下动态链接库的调用方法。 2、相关知识介绍 动态链接库是一个可执行模块,它包含的函数可以由Windows应用程序调用以提供所需功能,为应用程序提供服务。 2.1动态链接库基础知识 大型的应用程序由很多模块组成,这些模块彼此协作,以完成整个软件系统的工作。其中可能有些模块的功能是通用的,被多个软件系统使用。在设计软件系统时,如果将整个模块的源代码都静态编译到整个应用程序.exe文件中,会产生两个问题,一是应用程序过大,运行时消耗较大的内存空间;二是在修改程序时,每次程序的调整都必须编译所有的源代码,这个增加了编译过程的复杂度。 Windows提供的动态链接库,可以将独立的模块单独编译和测试,生成动态链接库,运行时,只有在主程序需要时,才将动态链接库装入内存并运行。这样,不仅减少了应用程序的大小及对内存的大量需求,而且动态链接库可以被多个应用程序使用,从而充分利用了资源。Windows系统中一些主要的系统功能都是以动态链接库的形式出现的,如设备驱动程序等。 动态链接库文件在Windows系统中的扩展名为.dll。它由全局数据结构、若干个函数组成,运行时被加载到进程的虚拟地址空间,成为调用进程的一部分。 2.2 动态链接库入口函数 DLLMain( )函数是动态链接库的入口函数,当Windows系统加载动态链接库时调用该函数,同时在动态链接库与进程分离时也调用函数,每个动态链接库必须有一个入口点。就像c语言编程应用程序时必须有main( )函数一样,在Windows系统的动态链接库中DLLMain( )是默认的入口函数。

动态链接库DLL的编写入门

动态链接库DLL的编写入门 一、前言 自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着,例如显示的字体和图标存储在GDI DLL中、显示Windows桌面和处理用户的输入所需要的代码被存储在一个User DLL中、Windows编程所需要的大量的API函数也被包含在Kernel DLL中。 在Windows操作系统中使用DLL有很多优点,最主要的一点是多个应用程序、甚至是不同语言编写的应用程序可以共享一个DLL文件,真正实现了资源"共享",大大缩小了应用程序的执行代码,更加有效的利用了内存;使用DLL的另一个优点是DLL文件作为一个单独的程序模块,封装性、独立性好,在软件需要升级的时候,开发人员只需要修改相应的DLL文件就可以了,而且,当DLL中的函数改变后,只要不是参数的改变,程序代码并不需要重新编译。这在编程时十分有用,大大提高了软件开发和维护的效率。 既然DLL那么重要,所以搞清楚什么是DLL、如何在Windows操作系统中开发使用DLL 是程序开发人员不得不解决的一个问题。本文针对这些问题,通过一个简单的例子,即在一个DLL中实现比较最大、最小整数这两个简单函数,全面地解析了在Visual C++编译环境下编程实现DLL的过程,文章中所用到的程序代码在Windows98系统、Visual C++6.0编译环境下通过。 二、DLL的概念

DLL是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个DLL(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的DLL。DLL库不同于静态库,在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在处理程序代码时将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。 在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。 微软的Visual C++支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、Regular Dll (常规DLL)、Extension Dll(扩展DLL)。Non-MFC DLL指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。Regular DLL:和下述的Extension Dlls一样,是用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),被导出的函数是C函数、C++类或者C++成员函数(注意不要把术语C++类与MFC的微软基础C++类相混淆),调用常规DLL的应用程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是在Visual C++、Dephi、Visual Basic、Borland C等编译环境下利用DLL开发应用程序。 常规DLL又可细分成静态链接到MFC和动态链接到MFC上的,这两种常规DLL的区别将在下面介绍。与常规DLL相比,使用扩展DLL用于导出增强MFC基础类的函数或子类,用这种类型的动态链接库,可以用来输出一个从MFC所继承下来的类。

相关主题
文本预览
相关文档 最新文档