未完待续
查阅msdn官方文档发现,导出dll有三种方式,一种是使用.def文件导出,另一种是在代码中使用宏__declspec(dllexport)导出,最后一种是配置vc工程的属性,使用LINK 命令中的 /EXPORT 规范
我们先创建一个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文件加入到工程中,在属性页中进行如下配置
因为我们是生成dll,所以还要进行如下修改
然后编译运行,成功后,在debug/release目录可以找到生成的dll和lib文件,然后我们就可以拿去用了。
未完待续
未完待续
在程序中调用dll中的函数有两种方式,一种是通过lib文件给出的函数地址从dll中调用,另一种是直接通过函数名调用dll中的函数。
首先将导出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相关的函数我们可以查阅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;
}