外部DLL创建及使用
1. 静态链接库和动态链接库区别
- 静态链接库中不能再包含其他的动态链接库或者静态链接库;
- 动态链接库中还可以包含其他的动态或静态链接库。
2. 简单说明一些库的作用
- kernel32.dll主要处理内存管理和进程调度;
- user32.dll主要控制用户界面;
- gdi32.dll负责图形方面的操作;
3. VC++支持的三种DLL
- `Non-MFC DLL`:非MFC动态库,不采用MFC类库结构,导出函数为标准的C接口,能被非MFC或MFC编写的应用程序锁调用;
- `MFC Regular DLL`:MFC规则DLL,包含一个继承自CWinApp的类,没有消息循环;
- `MFC Extension DLL`:MFC扩展DLL,采用MFC的动态链接版本创建,只能被MFC类库编写的应用程序调用;
4. 库的调试
在使用的地方打断点,运行到该出时按F11可以进入库中的函数进行调试。
5. 在函数名前面添加__declspec(dllexport)声明函数为DLL的导出函数
6.VS中动态链接库的使用方法
动态调用
- 首先使用typedef定义一个与函数参数类型和返回值均相同的函数指针类型;
typedef 函数返回类型 (*自定义函数指针名字)(参数列表);
- 其次,定义一个HINSTANCE句柄,通过Loadibrary动态加载dll模块
HINSTANCE hDLL = LoadLibrary("dll名字");
- 再次,使用GetProcAddress加载函数
自定义函数指针名 自定义函数 = GetProcAddress("函数名");
- 最后,使用FreeLibrary()释放DLL模块。
FreeLibrary(hDll);
静态调用
#pragma comment(lib,"lib名字")
extern "C" _declspec(dllimport) 函数名(参数列表);
7. 声明导出函数
既可以用_declspec(dllexport),也可以采用模块定义文件声明.def。
示例:
;lib.def:导出函数
LIBRARY dllTest ;说明文件相应的dll
EXPORT ;列出要导出函数的名称
add @ 1
8. 声明类和导出类
#ifdef DLL_FILE
class _declspec(dllexport) class_name //导出类
#else
class _declspec(dllimport) class_name //导入类
9. QT中静态链接调用
.pro
文件中把..h
和.lib
文件包含进去,.cpp
头文件中include依赖库头文件;- 调用外部dll中的方法;
10. QT中共享链接/动态链接调用
.cpp
中增加#include <QLibrary>
示例:
#include <QCoreApplication>
#include <QLibrary> // 引入QLibrary类
#include <iostream>typedef int (*Add)(int a,int b); // 定义函数指针
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QLibrary mylib("MyLib1.dll");if(!mylib.load()) // 加载dll{std::cout << "Load Library Failed" << std::endl;return -1;}Add add = (Add)mylib.resolve("add"); // 定义函数指针对象if(0 == add){std::cout << "Load Function Failed" << std::endl;return -2;}int sum = add(1,2); // 使用std::cout << "sum=" << sum <<std::endl;return a.exec();
}