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

合集下载

如何用VC编写DLL动态链接库文件

如何用VC编写DLL动态链接库文件

如何用VC编写DLL动态链接库文件作者: falcon 发表日期: 2006-04-24 14:51引言前不久刚学会了如何用VB编写DLL动态链接库,但是用vb编写动态链接库比较麻烦些。

下面我们再学习一下如何用vc编写dll动态链接库,并且通过vc或者vb调用正文这里主要介绍两个东东第一:用vc编写动态链接库,用vc调用第二:用vb编写动态链接库,用vb调用一、用vc编写动态链接库,用vc调用1、创建DLL文件,命名为FIRSTDLL1)打开visual c++ 6.0通过new创建一个win30 Dynamic-link Libary的工程,命名为FIRSTDLL2)接着选择最后一个选项,让系统帮我们创建一些必要的文件3)把FIRSTDLL.cpp用下面的代码覆盖Code:[Ctrl+A Select All]4)接着我们在FIRSTDLL.h头文件里头用下面的代码覆盖Code:[Ctrl+A Select All]5)好拉,我们现在可以编译FIRSTDLL.cpp文件拉,到debug目录下看看,是不是已经生成拉我们需要的FIRSTDLL.dll拉2、通过vb编写一个函数来调用该DLL,该函数为USEFIRSTDLL1)同样通过new创建一个工程,该工程为win30 application,命名USEFIRSTDLL2)在USEFIRSTDLL.cpp文件中用如下代码覆盖Code:[Ctrl+A Select All]好拉,到这里第一部分介绍完拉下面介绍第二部分二、用vc编写动态链接库,用vb调用在介绍这个之前必须声明的是(引用自下面的参考资料)一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一个是必须是export的。

要做到第一条,只须在函数声明前加上__stdcall关键字。

如:short __stdcall sample(short nLen, short *buffer)要做到第二条,需要在*.def文件中加上如下的几行:EXPORTSsample @1这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每个函数都不一样。

使用VisualStudio进行动态链接库开发流程

使用VisualStudio进行动态链接库开发流程

使⽤VisualStudio进⾏动态链接库开发流程⼀、动态链接库和动态链接动态链接库:在 Windows 中,动态链接库 (DLL) 是作为函数和资源的共享库的⼀种可执⾏⽂件。

在调⽤它们的应⽤程序的上下⽂中运⾏。

动态链接:动态链接是操作系统功能。

操作系统将 DLL 加载到应⽤程序的内存空间中,它可使执⾏⽂件调⽤函数或使⽤存储在单独⽂件中的资源。

动态链接库有什么⽤: DLL 可以在可执⾏⽂件之间轻松共享函数和资源。

多个应⽤程序可同时访问内存中单个 DLL 副本的内容。

⼆、和静态链接的区别这部分我们只需要知道静态链接把所有的执⾏需要的库都打包到可执⾏⽂件⾥⾯了,动态链接则是把各个库独⽴出来,在运⾏时由操作系统将 DLL 加载到应⽤程序的内存空间中。

在Windows上具体⼀些就是:静态链接将静态库中的所有对象代码复制到⽣成时使⽤它的可执⾏⽂件中。

动态链接仅包括 Windows 在运⾏时⽤于查找和加载含有数据项或函数的 DLL 所需的信息。

创建 DLL 时,还将创建包含此信息的导⼊库。

⽣成调⽤ DLL 的可执⾏⽂件时,链接器会使⽤导⼊库中的导出符号来为 Windows 加载程序存储此信息。

当加载程序加载 DLL 时,该 DLL 会映射到你的应⽤程序的内存空间中。

如果存在,则调⽤ DLL 中的特殊函数 DllMain,以执⾏ DLL 所需的任何初始化。

也可以直接看看的介绍,单击蓝字访问。

三、⽤VS⽣成动态库的基本流程这⾥我们使⽤C++语⾔开发,对于环境有的要求如下:1、Visual Studio。

2、VS中安装了 “C++ 的桌⾯开发” ⼯作负载。

如果在安装 Visual Studio 时未安装此⼯作负载,可以再次运⾏安装程序并⽴即安装。

Visual Studio的安装和配置可以,单击蓝字访问即可。

具体步骤如下:①在 Visual Studio 2019 中创建 DLL 项⽬在菜单栏上,选择“⽂件”>“新建”>“项⽬”,打开“创建新项⽬”对话框。

VC6.0如何创建以及调用动态链接库实例详解

VC6.0如何创建以及调用动态链接库实例详解

VC6.0如何创建以及调⽤动态链接库实例详解⼩弟在公司的职责,在上篇博客中已经简约介绍。

这边博客主要介绍技术的应⽤⽽不在细究原理。

因为公司项⽬着急,出结果要紧,并且咱也不是专注搞研究的,所以,基本懂了原理后,直接上⼿⼯作,搞出demo来最好。

⾄于公司⼯作情况,今天暂且略过,当然也不是⼀两句能够表达清楚的。

后⾯会有相应的⼯作总结,敬请期待……现在,废话少说,直奔主题——VC6.0中创建动态链接库。

作为客户与后台的中介,为了更好的调节两⽅的关系,我明智滴选择了webservice以及动态链接库。

在与客户c++使动态链接库⽅式,⽽与后台java,使⽤webservice来交流沟通。

既然有了动态链接库,肯定⼤家会想到静态链接库。

呵呵,这个是相对的。

那这两者有什么区别呢?那⼜为静态链接库:是把lib⽂件也打包到了exe⽂件中。

动态链接库:没有把lib⽂件打包到exe⽂件中,若是使⽤,则直接加载卸载相应的dll⽂件。

并且,静态链接库中不允许包含静态链接库和动态链接库,⽽动态链接库中是允许包含静态链接库和动态链接库的。

因为⼩弟封装的dll中是调⽤客户的dll,并且有可能包含另外⾃⼰的动态链接库。

鉴于此,⼩弟选择了动态链接库。

还有⼀点是,动态链接库,也是分为三种情况的。

⼀是⾮MFC的dll(也就是控制台的dll),⼆是常规的MFC的dll(其中⼜分静态的dl和共享的dll),三是扩展的MFC 的dll。

并且MFC的dll可以被MFC程序或者控制台程序调⽤。

因为⼩弟封装的dll,需要供MFC程序调⽤,所以选择使⽤了MFC常规的dll。

并且使⽤控制台程序做测试。

⾸先,在新建⼯程中选择MFC AppWizard (dll)然后在头.h⽂件中,声明被外界调⽤的函数复制代码代码如下:extern "C" _declspec(dllexport) char* queryFunctionByFID(char* funcId);声明后,在cpp⽂件中,实现此函数。

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

CC++中动态链接库的创建和调用
3、在DllDemo.cpp文件中导入DllDemo.h文件,并实现Max(int,int)函数
以下是引用片段: #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; }
LIBRARY MyDll
EXPORTS
Max@1
4、编译程序生成动态连接库。
4、编译程序生成动态连接库
二、用.def文件创建动态连接库DllDemo.dll。
1、删除DllDemo工பைடு நூலகம்中的DllDemo.h文件。
2、在DllDemo.cpp文件头,删除 #include DllDemo.h语句。
3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句:
动态连接库的创建步骤:
一、创建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

VC中使用动态链接库DLL

VC中使用动态链接库DLL

VC中使用动态链接库DLL:静态调用和动态调用2010-05-02 15:56VC中生成DLL的办法见:/KB/DLL/RegDLL.aspx--------------------------------------VC中使用DLL/c1230v/articles/1401448.html调用DLL有两种方法:静态调用和动态调用.(一).静态调用其步骤如下:1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;2.把你的youApp.lib拷到你目标工程(需调用youApp.DLL的工程)目录下;3.把你的youApp.h(包含输出函数的定义)拷到你目标工程(需调用youApp.DLL的工程)目录下;4.打开你的目标工程选中工程,选择Visual C++的Project主菜单的Settings菜单;5.执行第4步后,VC将会弹出一个对话框,在对话框的多页显示控件中选择Link页。

然后在Object/library modules输入框中输入:youApp.lib6.选择你的目标工程Head Files加入:youApp.h文件;7.最后在你目标工程(*.cpp,需要调用DLL中的函数)中包含你的:#include "youApp.h"注:youApp是你DLL的工程名。

(二).动态调用其程序如下:动态调用时只需做静态调用步骤1.01 {02 HINSTANCE hDllInst = LoadLibrary("youApp.DLL");03if(hDllInst)04 {05typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);06 MYFUNC youFuntionNameAlias = NULL;07// youFuntionNameAlias 函数别名08 youFuntionNameAlias = (MYFUNC)GetProcAddress(hDllInst,"youFuntionName"); 09// youFuntionName 在DLL中声明的函数名10if(youFuntionNameAlias)11 {12 youFuntionNameAlias(param1,param2);13 }14 FreeLibrary(hDllInst);15 }16 }显式(静态)调用:LIB + DLL + .H,注意.H中dllexport改为dllimport隐式(动态)调用:DLL + 函数原型声明,先LoadLibrary,再GetProcAddress(即找到DLL中函数的地址),不用后FreeLibrary--------------------------------------动态链接库DLL的链接/mmycly/archive/2006/06/15/917076.aspx应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。

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

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中的函数名,并转换成原来的函数,比较麻烦。

操作系统实验一_动态链接库的建立与调用

操作系统实验一_动态链接库的建立与调用

上海电力学院计算机操作系统原理实验报告题目:实验一动态链接库的建立与调用院系:计算机科学与技术学院班级:学生姓名:学号:评语:成绩:2014年10 月10日上海电力学院实验报告课程名称:计算机操作系统实验项目:动态链接库的建立与实调用姓名:学号:班级:专业:同组人姓名无指导教师姓名徐曼实验日期一.实验目的和要求:1.理解动态链接库的实现原理;2.掌握WINDOWS系统动态链接库的建立方法;3.掌握WINDOWS环境下动态链接库的调用方法。

4.掌握动态链接库建立和调用方法,在WINDOWS XP+VC++6.0环境下建立一个动态链接并分别使用隐式和显式将其调用,从而体会使用动态链接库的优点。

二.实验内容:1.在Windows环境下建立一个动态链接库。

2.使用隐式调用法调用动态链接库。

3.使用显式调用法调用动态链接库。

三.实验平台:Visual Studio C++ 6.0四.实验原理本次实验将在Windows 7和Visual Studio C++ 6.0环境下建立一个动态链接库,分别使用隐式和显示的方式将其调用。

动态链接库是一个可执行模块,它包含的函数可以由Windows应用程序调用提供所需功能,为应用程序提供服务。

五.实验步骤与记录1)启动Visual Studio C++ 6.02)选择file->new命令,新建一个Win32 Dynamic-Link Linrary 程序。

3)创建一个简单的工程4)用户直接使用DllMain的动态链接库入口函数5)使用编译连接工具生成动态链接库6)动态连接库的隐式调用首先建立一个Win32 Console Application,在位置栏内输入工程文件名所在路径。

7)选择控制台文件类型:一个支持MFC的程序,单击完成按钮。

8)用此文件中的CallDll.cpp调用前面建立好的函数动态链接库Mydll.dll9)生成控可执行文件之前,把Mydll.dll复制到工程文件CallDll的debug文件中,将Mydll.lib复制到CallDll.cpp中,然后在Microsoft Visual C++环境下,选择Project Setting 命令,在连接选项中的Project Options 文本框中输入动态链接库的导入/导出库文件Mydll..lib10)如果需要设置函数调用参数传递,在编辑环境中进行设置。

如何用VC创建及调用DLL

如何用VC创建及调用DLL

如何用VC创建及调用DLL使用Visual C++(VC++)创建和调用动态链接库(DLL)可以提供一种模块化的方式来组织和重用代码。

本文将介绍如何使用VC++创建DLL,并在另一个VC++项目中调用该DLL。

创建DLL以下是使用VC++创建DLL的步骤:1.打开VC++,在“文件”菜单中选择“新建”->“项目”。

2. 在“新建项目”对话框中,选择“Win32控制台应用程序”。

点击“下一步”。

3.输入项目名称,并选择项目位置,点击“下一步”。

4.在“应用程序类型”对话框中,选择“DLL”并取消勾选“预编译头”。

点击“下一步”。

5.在“进入代码”对话框中,选择“空项目”。

点击“完成”。

6. 创建一个新的源文件,例如“MyDLL.cpp”。

7. 在“MyDLL.cpp”中,编写所需的函数并导出。

例如:```C++#include <Windows.h>// 导出的函数需要使用__declspec(dllexport)修饰extern "C" __declspec(dllexport) int AddNumbers(int a, int b) return a + b;```8. 在项目属性中,选择“链接器”->“高级”,将“入口点”设置为“DllMain”。

9.在“生成”菜单中选择“生成解决方案”,以生成DLL文件。

以下是在VC++项目中调用DLL的步骤:1.打开VC++,在“文件”菜单中选择“新建”->“项目”。

2. 在“新建项目”对话框中,选择“Win32控制台应用程序”。

点击“下一步”。

3.输入项目名称,并选择项目位置,点击“下一步”。

4.在“应用程序类型”对话框中,选择“控制台应用程序”并取消勾选“预编译头”。

点击“下一步”。

5.在“附加选项”对话框中,勾选“空项目”。

点击“完成”。

6.将之前生成的DLL文件复制到新项目的文件夹中。

7.在项目属性中,选择“C/C++”->“常规”,将“附加包含目录”设置为包含DLL文件的文件夹路径。

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

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)。

VC6.0作的动态链接库程序的详细操作步骤

VC6.0作的动态链接库程序的详细操作步骤

实验三:创建和使用动态链接库:实现弹出一个对话框、求最大值、作加法功能操作步骤:一、创建一个动态链接库1、新建“Win32 Dynamic-Link Library”动态链接库,选择路径并命名2、在“DllFile.cpp”添加如下代码#include "stdafx.h"#include "DllFile.h"HMODULE g_hModule;//主函数BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch (ul_reason_for_call){case DLL_PROCESS_A TTACH:g_hModule = (HMODULE)hModule; // 保存模块句柄break;}return TRUE;}// 自定义导出函数void ExportFunc(LPCTSTR pszContent){char sz[MAX_PA TH];::GetModuleFileName(g_hModule, sz, MAX_PA TH);::MessageBox(NULL, pszContent, strrchr(sz, '\\') + 1, MB_OK);}//作加法int add( int x, int y){return ( x +y );}//求最大值int MaxMin(int x,int y){if( x >= y )return x;elsereturn y;}3、在“DllFile.h”中声明要导出的函数//声明要导出的函数__declspec(dllexport) void ExportFunc(LPCTSTR pszContent);__declspec(dllexport) int add( int x, int y);__declspec(dllexport) int MaxMin(int x,int y);4、采用在运行期间动态链接,即运行过程中显示地加载DLL库,从中导出需要的函数。

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

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)。

VC6创建动态库文件(FLL)给VFP调用步骤

VC6创建动态库文件(FLL)给VFP调用步骤

创建用于VFP的动态库(FLL格式)一、使用VC++ 6创建FLL文件的步骤:1.打开VC++ 6,并在VC中新建空项目testadd(类型:Win32 Dynamic-LinkLibrary动态库)2.添加或编写源代码文件testadd.c,如格式为*.C,不能用*.cpp表示的文件。

内容如下:// 注意:不要用向导建成testadd.cpp#include "pro_ext.h"// 注意:如果写成#include <pro_ext.h>,需要把pro_ext.h拷贝到Visul C++之Include文件夹void TestAdd(ParamBlk FAR *parm){int x1;x1 = parm->p[0].val.ev_long + parm->p[1].val.ev_long;_RetInt(x1,10);}FoxInfo myFoxInfo[] = {{"TESTADD", (FPFI)TestAdd,2,"I,I"},};FoxTable _FoxTable={(FoxTable *)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo};3.头文件及库文件复制(很关键,设置不对会导致编译错误)拷贝pro_ext.h,winapims.lib到testadd文件夹这两个文件在“盘符:\Program Files\Microsoft visual foxpro 9\Samples\API”目录下4.项目设置(很关键,设置不对会导致编译错误)点击项目(Project)中<设置(Settings)>,(1)在C++选项卡中,删除编译器开关参数中的/GZ,增加 /Gr /MD(注意:因Vfp要求fastcall,必须加/Gr选项)(2)在Link选项卡中,添加WINAPIMS.LIB和msvcrt.lib(建议msvcrt.lib放在最后)即可成功5.重新编译在debug目录下生成testadd.dll后,将它复制到FOXPRO相应的目录下set libr to release\testadd.dll ?testadd(1,2)。

VC中静态链接库、动态链接库编程深入浅出详解

VC中静态链接库、动态链接库编程深入浅出详解

VC++动态链接库(DLL)编程深入浅出‎(一)1.概论先来阐述一下‎D LL(Dynami‎c Linkab‎l e Librar‎y)的概念,你可以简单的‎把DLL 看成一种仓库‎,它提供给你一‎些可以直接拿‎来用的变量、函数或类。

在仓库的发展史上经‎历了“无库-静态链接库-动态链接库”的时代。

[被屏蔽广告] 静态链接库与‎动态链接库都‎是共享代码的‎方式,如果采用静态链接库,则无论你愿不‎愿意,lib 中的指令都被‎直接包含在最‎终生成的 EXE 文件中了。

但是若使用 DLL,该 DLL 不必被包含在‎最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载‎这个与 EXE 独立的 DLL 文件。

静态链接库和‎动态链接库的另外一‎个区别在于静‎态链接库中不‎能再包含其他‎的动态链接库‎或者静态库,而在动态链接‎库中还可以再‎包含其他的动‎态或静态链接‎库。

对动态链接库‎,我们还需建立‎如下概念:(1)DLL 的编制与具体‎的编程语言及‎编译器无关只要遵循约定‎的DLL 接口规范和调‎用方式,用各种语言编‎写的 DLL 都可以相互调用。

譬如 Window‎s提供的系统 DLL(其中包括了 Window‎s的 API),在任何开发环境中‎都能被调用,不在乎其是 Visual‎Basic、Visual‎C++还是 Delphi‎。

(2)动态链接库随‎处可见我们在 Window‎s目录下的 system‎32 文件夹中会看‎到kernel‎32.dll、user32‎.dll 和 gdi32.dll,window‎s的大多数 API 都包含在这些‎DLL 中。

kernel‎32.dll 中的函数主要‎处理内存管理‎和进程调度;user32‎.dll 中的函数主要控制‎用户界面;gdi32.dll 中的函数则负‎责图形方面的‎操作。

一般的程序员‎都用过类似 Messag‎e Box 的函数,其实它就包含‎在user32‎.dll这个动态链接‎库中。

VC及VS中生成与调用DLL

VC及VS中生成与调用DLL

一、本周主要工作内容本周我主要研究了DLL的概念、生成方法、调用方法,为以后程序的模块化与移植打下基础。

1. DLL的概念动态链接库DLL全称是Dynamic Linkable Library,DLL是一个包含可由多个程序同时使用的代码和数据的库,而不是可执行文件。

动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。

函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。

DLL 还有助于共享数据和资源。

多个应用程序可同时访问内存中单个DLL 副本的内容。

DLL 的编制与具体的编程语言及编译器无关只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。

譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。

VC动态链接库的分类Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。

DLL可导出的类型DLL可以导出:全局变量、函数、类2. DLL的生成方法1)VC中生成Non-MFC DLL在VC++中新建一个Win32 Dynamic-Link Library的工程,并声明接口函数声明方法一:在头文件中声明(以最简单的相加函数为例):extern "C" _declspec(dllexport) int Sum(int a,int b);声明方法二:采用模块定义(.def) 文件声明,(.def)文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。

在(.def)文件中添加如下代码:LIBRARY dllTestEXPORTSadd @ 1声明完成后在源文件.cpp中完成接口函数的实现。

接口中VC中连接库的生成与调用

接口中VC中连接库的生成与调用

第四节 VC中连接库的生成与调用以上有关服务的调用过程比较复杂,涉及到的概念也比较多,很容易造成混乱和差错。

在实用中,我们完全可以将这部分代码封装起来直接调用,使得程序简单明了。

在VC中,这样的封装方法有多种,静态库和动态库是常用的在设备驱动函数调用的方式。

许多硬件接口板提供的程序接口就是这样的一些函数调用。

6.4.1静态库的生成与调用Win32静态库是指在程序执行之前,库函数的代码就已经链接到生成的可执行文件中,无论是否被调用都随程序的执行被加载到内存中。

1. 库文件的生成在VC中,可以生成Win32静态库Lib文件,其中的函数可以供其它程序调用。

在建立库文件项目时在项目向导中必须选择生成Win32静态库的程序选项,见下图:在源程序中,库程序的结构与普通程序有点差异,需要在程序开头加以说明外部调用的函数及其格式,在所有源文件中也没有主函数。

例如说明OnOpenService函数为:extern "C" void OnOpenService();即声明OnOpenService函数为C编译、连接方式的外部函数。

在函数的实现过程中与普通函数没有差异,但是为了通用,MFC的函数调用不要使用。

使用Build命令即可以生成库文件的二进制代码(.lib文件)供其它程序调用了。

下面是采用静态库的方法,将前面的打开服务和删除服务的函数封装为两个库函数,供应用程序调用,这样在应用程序中就可以完全屏蔽了有关系统服务的细节。

在构造静态库函数时,必须注意仅使用基本C的部分,否则在调用时回产生错误。

所以在下面的函数中,将CString的使用和AfxMessageBox()对话框的调用都去除了。

// svrlib.cpp#include <Windows.h>#include "winsvc.h"extern "C" void OnOpenService();extern "C" void OnRemoveService();void OnRemoveService(){// open service managerSC_HANDLE svm = OpenSCManager(NULL, NULL,SC_MANAGER_ALL_ACCESS);if (svm = = NULL) {//AfxMessageBox("Cannot open service manager");return;}// open the specified serviceSC_HANDLE svc = OpenService(svm, "SppIO", SERVICE_ALL_ACCESS);if (svc == NULL){//AfxMessageBox("SppIO is not installed or cannot be found");return ;}// get binary path nameQUERY_SERVICE_CONFIG *pQSC;DWORD dwActual;BOOL bRet = QueryServiceConfig(svc, NULL, 0, &dwActual);pQSC = (QUERY_SERVICE_CONFIG*)new BYTE[dwActual];QueryServiceConfig(svc, pQSC, dwActual, &dwActual);//CString strFile = pQSC->lpBinaryPathName;delete pQSC;//strFile = strFile.Right(strFile.GetLength() - 4);SERVICE_STATUS ss;bRet = ControlService(svc, SERVICE_CONTROL_STOP, &ss);if (bRet = = FALSE) {//AfxMessageBox("Cannot stop service/already stopped");return;}bRet = DeleteService(svc);if (bRet = = FALSE) {//AfxMessageBox("Cannot delete service");bRet = CloseServiceHandle(svc);}bRet = CloseServiceHandle(svc);if (bRet = = FALSE) {//AfxMessageBox("Cannot close service");return;}else {//AfxMessageBox("SppIO successfully deleted");return;}}void OnOpenService(){SC_HANDLE scm =OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);if(scm = = NULL){//AfxMessageBox("error in OpenSCManager");return;}SC_HANDLE svc = CreateService(scm,"SppIO","SppIO", SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER, SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,"c:\\sppio.sys",NULL,NULL,NULL,NULL,NULL);if(svc == INVALID_HANDLE_VALUE)//AfxMessageBox("error in CreateService");return;if ( !StartService(svc,0,NULL) )//AfxMessageBox("error in StartService");return;if ( !CloseServiceHandle(svc))//AfxMessageBox("error in CloseServiceHandle");return;}2库函数的调用在应用程序中调用库函数,基本方法与调用其它函数一样。

VC中DLL的创建及调用方法

VC中DLL的创建及调用方法

VC dll编程在我们实际用软件时,经常可看到许多动态连接库。

动态连接库有其自身的优点如节省内存、支持多语种等功能,而且,当DLL中的函数改变后,只要不是参数的改变调用起的函数并不需要重新编译。

这在编程时十分有用。

至于其他妙处,各位在电脑杂志、书籍中都能看到,我这里再说就是多说了.这次所要讲的是如何在VC6.0中如何做自己的Win32 DLLs,各位要做自己的动态连接库,首先要知道DLL在VC6.0中都有哪几种分类。

VC支持三种DLL,它们是:1.Non-MFC Dlls2.Regular Dlls3.Extension DllsNon-MFC DLL:指的是不用MFC的类库结构,直接用C语言写的DLL,其输出的函数一般用的是标准C接口,并能被非MFC或MFC编写的应用程序所调用。

LL,Regular DLL:和下述的Extension Dlls一样,是用MFC类库编写的。

明显的特点是在源文件里有一个继承CWinApp的类。

其又可细分成静态连接到MFC和动态连接到MFC上的。

但静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。

Extension DLL:用来实现从MFC所继承下来的类的重新利用,也就是说,用这种类型的动态连接库,可以用来输出一个从MFC所继承下来的类。

Extension DLL使用MFC的动态连接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。

各位看到这里如果眼有点花或头有点晕,请别泄气,再看两遍,然后继续往下看,定有收获。

这一节介绍Non-MFC DLLs的编写方法。

下面是一个通用的写法:BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch( ul_reason_for_call ) {case DLL_PROCESS_ATTACH:.......case DLL_THREAD_ATTACH:.......case DLL_THREAD_DETACH:.......case DLL_PROCESS_DETACH:.......}return TRUE;}每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。

VC++ 6.0如何创建与调用动态链接库

VC++ 6.0如何创建与调用动态链接库

VC++ 6.0如何创建与调用动态链接库1.静态链接库与动态链接库区别:静态链接库:lib中的指令被直接包含在最终生成的EXE文件中。

动态链接库:dll不必被包含在最终的EXE中,EXE文件执行时可以动态地引用和卸载DLL文件。

同时,静态链接库中不能再包含其他的动态链接库或静态库,而动态链接库中可以包含其他的动态或静态库。

2.VC++支持的DLL:DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL。

DLL导出函数(或变量、类)可供应用程序调用;DLL内部函数只能在DLL程序内使用,应用程序无法调用它们。

3.导出函数的声明方式:一种在函数声明类型和函数名之间加上“_declspec(dllexport)”。

另外一种采用模块定义(.def)文件声明,需要在库工程中添加模块文件,格式如下:LIBRARY 库工程名称EXPORTS 导出函数名4.DLL的调用方式:一种静态调用,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。

另外一种动态调用,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。

5.所有库工程编译时必须Release方式:Build—set active configuration—选择库工程的release方式6.示例:一、函数----创建动态链接库(MFC规则DLL)1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL //取名为MFC_dll2. def文件中添加:函数名(Add_new)3. h文件中添加:外部函数声明//求和函数,函数名为Add_newextern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b);4. cpp文件中添加:外部函数实现extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b){return a+b;}5. build--set active configuration--win32 release--ok6. 生成7. 根目录下release文件夹中dll,lib与根目录下h文件即为所需二、函数----调用动态链接库(把MFC_dll.dll和MFC_dll.lib拷到工程所在目录)//静态调用(.h可以写到.cpp文件中)1. new--projects--win32 console application--an empty project2. 添加h文件:(test.h)#pragma comment(lib,"MFC_dll.lib") //告诉编译器DLL相对应的lib文件所在路径和文件名extern "C" _declspec(dllimport) int _stdcall Add_new(int a,int b);//声明导入函数3. 添加cpp文件:(main.cpp)#include "test.h"int main(){cout<<Add_new(10,3);return 0;}//动态调用#include <stdio.h>#include <windows.h>typedef int (* lpAddFun)(int ,int);//定义一个与Add_new函数接受参数类型和返回值均相同的函数指针类型int main(){HINSTANCE hDll;//句柄lpAddFun addFun;//函数指针hDll=LoadLibrary("dllTest.dll");//动态加载DLL模块句柄if(hDll){addFun=(lpAddFun) GetProcAddress(hDll,"Add_new");//得到所加载DLL模块中函数的地址if(addFun){int result=addFun(2,3);printf("%d",result); } FreeLibrary(hDll);//释放已经加载的DLL模块}return 0;}三、变量----创建动态链接库(非MFC DLL)1. new---projects---win32 dynamic-link library----an empty project(Sample)2. 添加sample.h#ifndef SAMPLE_H#define SAMPLE_Hextern int dllGlobalVar;#endif3. 添加 sample.cpp#include "sample.h"#include <windows.h>int dllGlobalVar;bool APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)//windows在加载DLL时,需要一个入口函数,就如同控制台或DOS程序需要main函数、win32程序需要winmain函数一样。

用VC6定制和调用动态链接库

用VC6定制和调用动态链接库

通常我们在调用时所需地文件必须位于以下三个目录之一:()地系统目录:\\;()中所指出地任何目录;()程序所在地目录.一、动态链接库地结构动态链接库中定义有两种函数:导出函数( )和内部函数( ),导出函数可以被其它模块调用,内部函数只能在库内部使用.我们在用++定制动态库文件时,需要编写地就是包含导出函数表地模块定义文件()和实现导出函数功能地++文件.下面以为例介绍文件和实现文件地结构..模块定义文件()是一个或多个用于描述属性地模块语句组成地文本文件,每个文件至少必须包含以下模块定义语句:·第一个语句必须是语句,指出地名字;·语句列出被导出函数地名字;·可以使用语句描述地用途(此句可选);·“;”对一行进行注释(可选)..实现文件实现入口表函数地文件中,包含入口点处理地函数和导出函数地代码.二、创建.首先创建地工程,启动++按以下步骤生成工程:·在选单中选择\\;·在工程列表中选择-;·在中输入工程名;·单击右边按钮,选择:\目录;·单击完成,至此已创建了地工程文件..创建文件:·在选单中选择\\ ;·输入以下代码后保存文件名“”:;指出地名字,链接器将这个名字放到导入库中;定义导出函数()为例文件结束.创建.在选单中选择\\++项.输入以下代码后保存文件名“”#〈〉();为入口点函数,负责初试化并终止( )文档来自于网络搜索{ (){ ——:{ ; }--:{ ; } }; }(){ 蜂鸣器响一下(()-);("你好!");; }.编译文件从选单中选择,产生文件,以后就可以随时调用了.三、在应用程序中调用文件在应用程序中要首先装入后才能调用导出表中地函数,例如用创建基于对话框地工程,并在对话框上放置“”按钮,你就必须添加装载代码..首先在地首部添加变量设置代码:设置全局变量用于存储句柄;第二个变量是指向库中()函数地指针;.利用为“”按钮添加装载地代码:(){ 要添加地代码如下(){ (" .");文档来自于网络搜索; }装载,未加路径,将在三个默认路径中寻找("");返回中()函数地地址()(,""); } 文档来自于网络搜索.只要装载成功,在应用程序中就可以直接调用()函数(本程序在++中运行通过).。

动态链接库(dll)和静态库的创建及使用教程

动态链接库(dll)和静态库的创建及使用教程

动态链接库和静态库的创建及使用教程第一部分静态库(以vs2005为例)一、创建新的静态库项目1.从“文件”菜单中,选择“新建”,然后选择“项目…”。

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

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

4.为项目选择一个名称,如“MathFuncsLib”,并将其输入“名称”字段。

为解决方案选择一个名称,如“StaticLibrary”,并将其输入“解决方案名称”字段。

5.按“确定”启动Win32 应用程序向导。

在“Win32 应用程序向导”对话框的“概述”页中,按“下一步”。

6.从“Win32 应用程序向导”的“应用程序设置”页中,选择“应用程序类型”下的“静态库”。

7.从“Win32 应用程序向导”的“应用程序设置”页中,取消选择“附加选项”下的“预编译头”。

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

向静态库添加类1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。

将显示“添加新项”对话框。

从“类别”窗格中,选择“Visual C++”下的“代码”。

从“模板”窗格中选择“头文件(.h)”。

为头文件选择一个名称,如“MathFuncsLib.h”,并按“添加”。

将显示一个空白文件。

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

代码应与以下内容类似:// MathFuncsLib.hnamespace MathFuncs{class MyMathFuncs{public:// Returns a + bstatic double Add(double a, double b);// Returns a - bstatic double Subtract(double a, double b);// Returns a * bstatic double Multiply(double a, double b);// Returns a / b// Throws DivideByZeroException if b is 0static double Divide(double a, double b);};}3.若要为新类创建源文件,请从“项目”菜单中选择“添加新项…”。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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中调试通过。

当然看懂本文不是读者的最终目的,读者应亲自动手实践才能真正掌握DLL的奥妙。

问:学习本文需要什么样的基础知识?答:如果你掌握了C,并大致掌握了C++,了解一点MFC的知识,就可以轻松地看懂本文。

2.静态链接库对静态链接库的讲解不是本文的重点,但是在具体讲解DLL之前,通过一个静态链接库的例子可以快速地帮助我们建立“库”的概念。

图1 建立一个静态链接库如图1,在VC++6.0中new一个名称为libTest的static library工程(单击此处下载本工程附件),并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下://文件:lib.h#ifndef LIB_H#define LIB_Hextern "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函数了。

标准Turbo C2.0中的C库函数(我们用来的scanf、printf、memcpy、strcpy等)就来自这种静态库。

下面来看看怎么使用这个库,在libTest工程所在的工作区内new一个libCall工程。

libCall 工程仅包含一个main.cpp文件,它演示了静态链接库的调用方法,其源代码如下:#include <stdio.h>#include "..\lib.h"#pragma comment( lib, "..\\debug\\libTest.lib" ) //指定与静态库一起连接int main(int argc, char* argv[]){printf( "2 + 3 = %d", add( 2, 3 ) );}静态链接库的调用就是这么简单,或许我们每天都在用,可是我们没有明白这个概念。

代码中#pragma comment( lib , "..\\debug\\libTest.lib" )的意思是指本文件生成的.obj文件应与libTest.lib一起连接。

如果不用#pragma comment指定,则可以直接在VC++中设置,如图2,依次选择tools、options、directories、library files菜单或选项,填入库文件路径。

图2中加红圈的部分为我们添加的libTest.lib文件的路径。

图2 在VC中设置库文件路径这个静态链接库的例子至少让我们明白了库函数是怎么回事,它们是哪来的。

我们现在有下列模糊认识了:(1)库不是个怪物,编写库的程序和编写一般的程序区别不大,只是库不能单独执行;(2)库提供一些可以给别的程序调用的东东,别的程序要调用它必须以某种方式指明它要调用之。

以上从静态链接库分析而得到的对库的懵懂概念可以直接引申到动态链接库中,动态链接库与静态链接库在编写和调用上的不同体现在库的外部接口定义及调用方式略有差异。

3.库的调试与查看在具体进入各类DLL的详细阐述之前,有必要对库文件的调试与查看方法进行一下介绍,因为从下一节开始我们将面对大量的例子工程。

由于库文件不能单独执行,因而在按下F5(开始debug模式执行)或CTRL+F5(运行)执行时,其弹出如图3所示的对话框,要求用户输入可执行文件的路径来启动库函数的执行。

这个时候我们输入要调用该库的EXE文件的路径就可以对库进行调试了,其调试技巧与一般应用工程的调试一样。

图3 库的调试与“运行”通常有比上述做法更好的调试途径,那就是将库工程和应用工程(调用库的工程)放置在同一VC工作区,只对应用工程进行调试,在应用工程调用库中函数的语句处设置断点,执行后按下F11,这样就单步进入了库中的函数。

第2节中的libTest和libCall工程就放在了同一工作区,其工程结构如图4所示。

图4把库工程和调用库的工程放入同一工作区进行调试上述调试方法对静态链接库和动态链接库而言是一致的。

所以本文提供下载的所有源代码中都包含了库工程和调用库的工程,这二者都被包含在一个工作区内,这是笔者提供这种打包下载的用意所在。

动态链接库中的导出接口可以使用Visual C++的Depends工具进行查看,让我们用Depends 打开系统目录中的user32.dll,看到了吧?红圈内的就是几个版本的MessageBox了!原来它真的在这里啊,原来它就在这里啊!图5用Depends查看DLL当然Depends工具也可以显示DLL的层次结构,若用它打开一个可执行文件则可以看出这个可执行文件调用了哪些DLL。

好,让我们正式进入动态链接库的世界,先来看看最一般的DLL,即非MFC DLL(待续...)上节给大家介绍了静态链接库与库的调试与查看(动态链接库(DLL)编程深入浅出(一)),本节主要介绍非MFC DLL。

4.非MFC DLL4.1一个简单的DLL第2节给出了以静态链接库方式提供add函数接口的方法,接下来我们来看看怎样用动态链接库实现一个同样功能的add函数。

如图6,在VC++中new一个Win32 Dynamic-Link Library工程dllTest(单击此处下载本工程附件)。

注意不要选择MFC AppWizard(dll),因为用MFC AppWizard(dll)建立的将是第5、6节要讲述的MFC 动态链接库。

图6 建立一个非MFC DLL在建立的工程中添加lib.h及lib.cpp文件,源代码如下:/* 文件名:lib.h*/#ifndef LIB_H#define LIB_Hextern "C" int __declspec(dllexport)add(int x, int y);#endif/* 文件名:lib.cpp*/#include "lib.h"int add(int x, int y){return x + y;}与第2节对静态链接库的调用相似,我们也建立一个与DLL工程处于同一工作区的应用工程dllCall,它调用DLL中的函数add,其源代码如下:#include <stdio.h>#include <windows.h>typedef int(*lpAddFun)(int, int); //宏定义函数指针类型int main(int argc, char *argv[]){HINSTANCE hDll; //DLL句柄lpAddFun addFun; //函数指针hDll = LoadLibrary("..\\Debug\\dllTest.dll");if (hDll != NULL){addFun = (lpAddFun)GetProcAddress(hDll, "add");if (addFun != NULL){int result = addFun(2, 3);printf("%d", result);}FreeLibrary(hDll);}return 0;}分析上述代码,dllTest工程中的lib.cpp文件与第2节静态链接库版本完全相同,不同在于lib.h对函数add的声明前面添加了__declspec(dllexport)语句。

这个语句的含义是声明函数add为DLL的导出函数。

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

相关文档
最新文档