在编程中常常会用到别人封装好的dll文件,通常有两张调用的方法
一.隐式的加载时链接
需要xxx.dll文件、xxx.lib文件和xxx.h文件,其中将xxx.dll文件放在exe文件输出的文件夹下(debug文件夹),xxx.lib和xxx.h文件放在工程文件夹下。
(1)先将xxx.h文件添加至工程中(这个文件中有dll文件中函数声明,格式如
extern "C"__declspec(dllimport)函数返回类型
函数名(参数列表)
),然后在头文件中加入#include
"xxx.h"。
(2)将lib添加到工程中,有如下几种方法:
①LIB文件直接加入到工程文件列表中
在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入xxx.lib文件即可。
②设置工程的 Project Settings来加载DLL的LIB文件
打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中填写xxx.lib文件。
③通过程序代码的方式
可以在xxx.h 文件中加入预编译指令#pragma comment (lib,"xxx.lib")
二.显式的运行时链接
只需要xxx.dll文件,将xxx.dll文件放在exe文件输出的文件夹下(debug文件夹)。
需要添加如下代码
1. typedef 函数返回值类型 ( * 函数别名 )
(参数列表);//和dll文件中定义的函数一致
2. HINSTANCE hDLL;
3. 函数别名 函数名;//定义一个函数别名类型的函数名
4. hDLL=LoadLibrary("xxx.dll");//加载动态链接库xxx.dll文件
5. 函数名=(函数别名)GetProcAddress(hDLL,"dll文件中的对应的函数名");
6.
函数名(参数);//调用函数即可
三.常见的报错信息
Debug
Error:
Program: ...
Module:
File: i386\chkesp.c
Line: 42
解决方法:
定义函数指针(二.显式的运行时链接 中代码第一行)时,声明
typedef
函数返回值类型 (CALLBACK * 函数别名)(参数列表)
其中(CALLBACK *也可以是_stdcall,WINAPI)。去掉CALLBACK。(这个问题困扰了我两天,但是还是不清楚原因,去掉winapi后,程序正常,希望有大神可以指点)