vc中dll导出导入简单教程

来源:互联网 发布:淘宝开店卖什么挣钱 编辑:程序博客网 时间:2024/05/22 16:45

dll和lib的区别

未完待续

如何导出dll

查阅msdn官方文档发现,导出dll有三种方式,一种是使用.def文件导出,另一种是在代码中使用宏__declspec(dllexport)导出,最后一种是配置vc工程的属性,使用LINK 命令中的 /EXPORT 规范

一,使用.def文件导出

模块定义 (.def) 文件是包含一个或多个描述 DLL 各种特性的 Module 语句的文本文件。
.def 文件必须至少包含下列模块定义语句:
1,文件中的第一个语句必须是 LIBRARY 语句。 此语句将 .def 文件标识为属于 DLL。 LIBRARY 语句的后面是 DLL 的名称。 链接器将此名称放到 DLL 的导入库中。
2,EXPORTS 语句列出名称,可能的话还会列出 DLL 导出函数的序号值。 通过在函数名的后面加上 @ 符和一个数字,给函数分配序号值。 当指定序号值时,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。

步骤:

我们先创建一个win32控制台工程,然后在工程目录下添加.h和.cpp文件,内容如下:

//dll_export.hextern int global_value;int getTestDllValue();
//dll_export.cppint global_value = 255;int getTestDllValue(){    return 128;}

然后新建一个.def文件,放到工程目录下,命名为def_dll_export.def,内容如下(这里对.def的注释非常疑惑,如下的注释,在使用该dll时居然得不到global_value的值,把注释去掉就可以拿到值了。。。但是看msdn文档,这样注释又是没有问题的,保险起见,我还是不加注释了。。

LIBRARY def_dll_export.dllEXPORTS ;此处导出的是函数getTestDllValue;导出数据要指定DATA关键字global_value DATA

然后将.def文件加入到工程中,在属性页中进行如下配置

这里写图片描述

因为我们是生成dll,所以还要进行如下修改

这里写图片描述

然后编译运行,成功后,在debug/release目录可以找到生成的dll和lib文件,然后我们就可以拿去用了。

二,使用宏__declspec(dllexport)导出

未完待续

未完待续

如何使用dll

在程序中调用dll中的函数有两种方式,一种是通过lib文件给出的函数地址从dll中调用,另一种是直接通过函数名调用dll中的函数。

一,使用.lib和.h

首先将导出dll时使用的头文件,生成的lib库文件和dll文件放到工程目录下,并把头文件加入到工程中,然后在调用时加入类似下面的代码

#include "dll_export.h"#pragma comment(lib, "def_dll_export.lib");

注意,lib的相对路径要配置好。然后就可以调用相关的函数了。

int _tmain(int argc, _TCHAR* argv[]){    int i = getTestDllValue();    printf("%d", i);    return 0;}

二,直接调用dll函数

关于操作dll相关的函数我们可以查阅msdn的文档,链接
这里我只用到三个函数,分别是LoadLibrary(),GetProcAddress(),FreeLibrary(),函数的意义在名字上体现的很好了,不多说了,说下用法,如下

#include <Windows.h>int _tmain(int argc, _TCHAR* argv[]){    //加载dll,注意相对路径    auto dllFunc = LoadLibrary(_T("def_dll_export.dll"));    if (dllFunc)    {        //声明函数指针,和导出dll时头文件中函数类型一致        typedef int (*myfunc)();        myfunc pMyFunc;        //通过函数名获取函数在dll中的地址        pMyFunc = (myfunc)GetProcAddress(dllFunc, "getTestDllValue");        if (pMyFunc != NULL)        {            //调用函数            int j = pMyFunc();            printf("value:%d", j);        }        //释放对dll的引用        FreeLibrary(dllFunc);    }    return 0;}
0 0
原创粉丝点击