vc中dll导出导入简单教程

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.h
extern int global_value;
int getTestDllValue();
//dll_export.cpp
int global_value = 255;
int getTestDllValue()
{
    return 128;
}

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

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

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

vc中dll导出导入简单教程_第1张图片

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

vc中dll导出导入简单教程_第2张图片

然后编译运行,成功后,在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 

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;
}

你可能感兴趣的:(dll导出,dll导入,def,调用dll函数)