DLL动态链接库的创建与使用

?

动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库 --------------百度百科

?

下面我们使用vs2010创建一个可供win32程序使用的dll

?

  1. 打开vs2010,点击新建项目

    ?

  2. 新建一个win32项目

?

?

  1. 点击下一步

    ?

  2. 新建一个空的dll项目
  3. 右键源文件,添加,新建项

    ?

  4. 新建一个c文件
  5. 同样的在头文件里新建一个h文件
  6. 然后就可以开始写代码了

    每一个dll都有一个入口函数,这个入口函数叫做 DLLMain
    这个东西咱暂时用不到,就先不写了,如果你生成的是标准的dll文件,这个入口函数就会出现在你的源代码中。

    ?

    然后就可以开始写函数了,在写函数之前,先介绍一下dll中的规则

    ?

    1. 函数前面要加上修饰符 如__declspec(dllexport) 他的意思是 declear spece dll export 声明这是一个导出的dll函数。
    2. windows要求dll函数要加上修饰符CALLBACK (但这只是windows要求,dll要是不是给windows应用程序用的就不用加上这个)。
    3. 用extern "c"来表明使用c语言的规则解释函数

    ?

    函数:


__declspec(dllexport) void GiaoWarningA()

{

????MessageBoxA(NULL,"giao","warning",MB_OK);

????return;

}

?

__declspec(dllexport) void GiaoWarningW()

{

????MessageBoxW(NULL,L"giao",L"warning",MB_OK);

????return;

}

一般winapi中的函数都有两个版本,一个是ascii码版本,一个是unicode版本,windows使用宏来自动选择,例如


//编码判断

#ifdef UNICODE

#define GiaoWarning GiaoWarningA

?

#else

#define GiaoWarning GiaoWarningW

?

#endif

我们也可以借鉴这种思想,来自动选择是否加上extern "C"

?

例如


//语言判断

#ifdef __cplusplus

#define EXPORT extern
"C"
__declspec (dllexport)

#else

#define EXPORT __declspec (dllexport)

#endif

?

了解了这些我们就可以开始写我们的头文件了

头文件giao.h


//语言判断

#ifdef __cplusplus

#define EXPORT extern
"C"
__declspec (dllexport)

#else

#define EXPORT __declspec (dllexport)

#endif

?

//函数声明

EXPORT void CALLBACK GiaoWarningA();

EXPORT void CALLBACK GiaoWarningW();

?

//编码判断

#ifdef UNICODE

#define GiaoWarning GiaoWarningA

?

#else

#define GiaoWarning GiaoWarningW

?

#endif

注意这三块代码我摆放的顺序

  1. 语言判断 声明了EXPORT宏
  2. 函数声明????使用了EXPORT宏
  3. 编码判断 使用函数名创建了统一函数名的宏

?

另外还有一点,在函数声明中EXPORT void CALLBACK的顺序可别弄乱了


EXPORT void CALLBACK GiaoWarningA();

?

源文件giao.c


#include
"giao.h"

#include
<Windows.h>

?

EXPORT void CALLBACK GiaoWarningA()

{

????MessageBoxA(NULL,"giao","warning",MB_OK);

????return;

}

?

EXPORT void CALLBACK GiaoWarningW()

{

????MessageBoxW(NULL,L"giao",L"warning",MB_OK);

????return;

}

?

源文件中的函数原型与头文件中的一毛一样

还有就是头文件中要包含giao.h和函数用到的头文件

?

  1. 然后右键项目,点击生成

    ?

  2. 右键giao点击打开所在的文件夹
  3. 返回到上一级目录
    共有三个重要的文件 giao.h giao.lib giao.dll

    ?

  4. 进入这一级的Debug目录

?

?

  1. 然后就找到了全部的三个文件

    ?

  2. 如何使用动态链接库
    使用动态链接库的方法有两种,一种是启动时加载,一种是运行时加载

    我们先来将如何在 启动时加载链接库

    ?

  3. 启动时加载链接库
    我们依然还是新建一个win32项目

    ?

  4. 直接点击完成
  5. 右键打开项目所在文件夹
  6. 将之前的giao.h giao.lib giao.dll全都复制到这里
  7. 添加头文件 giao.h

    ?

?

  1. 添加链接库导入文件 giao.lib


    注意lib和dll的名字是你dll项目的名字,而h文件的名字是你创建的时候指定的,不要弄混了,还有这里千万不要写成wdnmd.dll要不然会出错,而且编译器也发现不了。

    ?

  2. 开始使用


我是把函数放在WM_PAINT里了,你也可以放在其他地方,

?

  1. 运行结果

?

  1. 运行时加载动态链接库
    我们会用到两个函数,LoadLibrary,GetProcAddress

    功能是加载动态链接库,获取函数地址

  2. 定义一个宏,创建两个变量
    因为我们会用到函数地址,就要用函数指针来保存这个函数地址
    而且因为我们要对GetProcAddress返回的地址进行强制类型转换,所以我们要定义一个宏来代替一个函数指针的类型

    还有一个实例句柄用来操作动态链接库


????typedef
void (*FUC)();

????FUC fuc;

????HINSTANCE hlibrary;

然后


hlibrary = LoadLibraryA("wdnmd.dll");

fuc = (FUC)GetProcAddress(hlibrary,"GiaoWarningA");

fuc();

?

这里我遇到了一些问题,GetProcAddress的返回值一直都是NULL,好像是函数名有问题。

找到了一些解决的方法,但也不是太好

?

关于__stdcall????????导出的函数名为: _函数名@0????????(0为参数所占的总字节数)

__fastcall????????导出的函数名为: @函数名@0????????(同上)

__cdel????????导出的函数名为: 函数名

啥都不加????????导出的函数名为: 函数名

windows要求的CALLBACK其实就是这个__stdcall,所以可以按照他的导出格式,去调用函数。如 fuc = (FUC)GetProcAddress(hlibrary,"[email protected]");

原文地址:https://www.cnblogs.com/jawide/p/11877156.html

时间: 2024-08-29 11:07:58

DLL动态链接库的创建与使用的相关文章

静态链接库LIB和动态链接库DLL的区别 创建和示例

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

创建dll动态链接库,并使用java调用

参考文章:http://www.cnblogs.com/matthew-2013/p/3480296.html http://blog.csdn.net/g710710/article/details/7255744 首先探讨何为动态链接库,按照百毒百科的解释: [动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式.这些库函数的扩展名是 ".dll"

LINUX系统中动态链接库的创建与使用{补充}

大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐.那么,在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少.在/lib目录下,就有许多以.so作后缀的文件,这

LINUX系统中动态链接库的创建与使用

大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐.那么,在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少.在/lib目录下,就有许多以.so作后缀的文件,这

QT5 动态链接库的创建和使用

记录一下QT5 动态链接库的创建和使用 在文章的最后有完毕的代码供下载 1.创建动态链接库 先新建一个库项目 选择chose进入下一下页面,类型选择共享库,输入一个名称:我输入的是sld 再点击下一步到 假设这里我们须要QtGui所以也勾选上了 再点击下一步直到完毕 我们在.pro文件中加上 DESTDIR =..\MyDebug 它的意思是我们把生成的内容放到这个目录里,假设没有它会自己主动生成 点击项目把Shadow build 去掉勾选 设置完毕后我们来实现方法測试 把sld.h改动成这样

QT5 动态链接库的创建和使用(QT自己做动态库给自己使用)

记录一下QT5 动态链接库的创建和使用 在文章的最后有完成的代码供下载 1.创建动态链接库 先新建一个库项目 选择chose进入下一下页面,类型选择共享库,输入一个名称:我输入的是sld 再点击下一步到 如果这里我们需要QtGui所以也勾选上了 再点击下一步直到完成 我们在.pro文件里加上 DESTDIR =..\MyDebug 它的意思是我们把生成的内容放到这个文件夹里,如果没有它会自动生成 点击项目把Shadow build 去掉勾选 设置完成后我们来实现方法测试 把sld.h修改成这样

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

DLL 有助于共享数据和资源.多个应用程序可同时访问内存中单个DLL 副本的内容.DLL 是一个包含可由多个程序同时使用的代码和数据的库.下面为你介绍C/C++中动态链接库的创建和调用. 动态连接库的创建步骤: 创建Dll有两种方式. 一.创建Non-MFC DLL动态链接库 1.打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project —>工程名:DllDemo 2.新建一个.h文件DllDe

动态链接库的创建

fangyukuan 2010.6.20 编写DLL时的函数与一般的函数方法基本一样.但要对库中的函数进行必要的声明,以说明哪些函数是可以导出的,哪些函数是不可以导出的. 把DLL中的函数声明为导出函数的方法有两种: 一是使用关键字_declspec(dllexport)来声明. 二是在.def文件中声明. 一.使用关键字_declspec(dllexport)来声明导出函数 声明函数SayHello为导出函数语句为:int _declspec(dllexport) SayHello (); 为

(转载)DLL动态链接库编程入门之三:MFC规则DLL(上)

上一节中讲解了非MFC DLL,本节将介绍如何创建MFC规则DLL及使用MFC规则DLL的方法. 一.MFC规则DLL概述 MFC规则DLL的概念体现在两方面: (1)它是MFC的 "是MFC的"意味着可以在这种DLL的内部使用MFC: (2)它是规则的 "是规则的"意味着它不同于MFC扩展DLL,在MFC规则DLL的内部虽然可以使用MFC,但是其与应用程序的接口不能是MFC.而MFC扩展DLL与应用程序的接口可以是MFC,可以从MFC扩展DLL中导出一个MFC类的