赞
踩
1.qt- 调用win32 DLL
2.qt- 调用MFC DLL
0概述:
01.扩展DLL:
必须有一个DllMain()函数,且调用AfxInitExtensionModule()函数。
CRuntimeClass类-初始化函数CDynLinkLibrary。
02.windows定位DLL文件:
1)exe同一目录
2)进程当前目录GetCurrentDirectory()
3) windows系统目录 GetSystemDirectory() c:\windows\system32
4) windows目录 GetWindowsDirectory() c:\windows
5) 列在path环境变量中的一系列目录。
03.32位和64位不能混用
EXE 和DLL需要位数相同。
04. def 文件:
041:VC6.0创建dll文件时自动生成.def文件,但里面没有函数名,只表名这是一个DLL文件。
- ; myvcdll.def : Declares the module parameters for the DLL.
-
- LIBRARY "myvcdll"
- DESCRIPTION 'myvcdll Windows Dynamic Link Library'
-
- EXPORTS
- ; Explicit exports can go here
042:VS2019下创建DLL时不会生成.def文件。
05.dll和exe在同一个文件夹下:
单独运行EXE时如果出现如下错误:
修改环境变量:把编译使用的路径放到最上面,且重启机器。
这是原来的:
06 dll和exe的文件编码要一致。
1.qt- 调用win32 DLL
1.1 DLL文件编写 :关键字+.def模块文件
1.11 导出方式:关键字 _declspec(dllexport)mydll.h
C++:支持重载机制,处理函数名,加入函数的返回类型。
C: 没有extern “C”时会提示,函数找不到的错误码(DWORD dw=::GetLastError();,得到dw=127)
1.111 mydll.h头文件如下创建,可被QT和VS创建的exe调用:
- #ifndef _MYDLL_H //防止重复引用
- #define _MYDLL_H
-
- # ifdef __cplusplus //如果这是一段cpp代码,那么加入 extern"C"{} 处理其中的代码。
- extern "c"{
- #endif
-
- _declspec(dllexport) void f();
- _declspec(dllexport) int min(int a, int b);
-
- #ifdef __cplusplus
- }
- #endif
- #endif
-
1.112 mydll.h头文件如下创建 ,只能被VS创建的exe调用:
- #define MYDECLARE_PUBLIC extern "C" _declspec(dllexport)
-
- _declspec(dllexport) void myDLL(void);
1.12 mydll.cpp
- #include "mydll.h"
- void f()
- {
- MessageBox(0,_T("你好,世界"),0,0);
- }
1.12 模块定义文件:(.def+.h+.cpp)
1.121.testdll.def文件:文件中的函数名就是要导出的函数名
- LIBRARY MYDLL; //可有可无,DLL名称
- DESCRIPTION "这是我的DLL"; //可有可无,DLL的解释
-
- EXPORTS //必须有 后面是函数名或者变量名
- f1
- f2
@ordinal 允许用序号导出函数,而不是以函数名导出。
1.122.tesdll.h 文件
- #ifndef _TEST_H
- #define _TEST_H //防止重复引用
-
- #include "tchar.h" //为了使用_T
-
- int f1(TCHAR *sz,int n);
- void f2();
-
- #endif
1.123.testdll.cpp文件
- #include "Test.h"
- #include "windows.h" //为了使用MessageBox
-
-
- int f1(TCHAR *sz, int n)
- {
- MessageBox(0,sz, 0, 0);
-
- return n;
- }
-
-
- void f2()
- {
- MessageBox(0, _T(" 你好,f2"), 0, 0);
- }
1.2DLL调用
1.21隐式链接
导入.lib文件。
包含头文件。
exe中调用dll中的函数和类。
配置:
1.211导入.lib 文件:
链接器->常规->附加库目录:lib库目录
链接器->输入->附加依赖项:lib文件名
1.212包含头文件:
C/C++->常规->附加包含目录
1.213 exe中调用dll中的函数
- #include "../test//mydll.h"
- #pragma comment(lib, "mydll.lib") //隐式链接方式
-
-
- void myexe::OnBnClickedpbt()
- {
-
- f(); //调用dll中的f() 函数
- }
2.qt- 调用MFC DLL
2.11win32 API
2.12qt自身的API
2.13直接调用DLL
2.14可视化设置
2.11.加载DLL::LoadLibrary(L"D:\C++\myDll\mydll.dll");
2.12. 得到导出函数的地址:lpfnDllFunc1 = (FUNC)GetProcAddress(hDLL,"f");
2.13.释放句柄:FreeLibrary(hDLL);
- #include <windows.h>
- #include <QMessageBox>
- typedef void (* FUNC) ();
-
- void Dialog::on_pushButton_clicked()
- {
- DWORD dw;
- HINSTANCE hDLL; // Handle to DLL
- FUNC lpfnDllFunc1; // Function pointer
- QString str;
-
- //1.加载
- hDLL = ::LoadLibrary(L"D:\C++\myDll\mydll.dll");
- if (hDLL)
- {
- //2.得到函数句柄
- lpfnDllFunc1 = (FUNC)GetProcAddress(hDLL,"f");
- if (!lpfnDllFunc1)
- {
- dw = ::GetLastError();
- FreeLibrary(hDLL);
- str.sprintf("GetProcAddress failed:%d",dw);
- QMessageBox::information(this,"Error code",str);
-
- }
- else
- {
- //3. 调用函数+释放句柄
- lpfnDllFunc1();
- FreeLibrary(hDLL);
- }
- }
- else
- {
- dw = ::GetLastError();
- str.sprintf("Load dll failed:%d",dw);
- QMessageBox::information(this,"Error",str);
- }
- }
2.12 calldefdll
2.121创建项目
2.122 dll ,lib, def 文件放在同一路径下。
.def 指定导出函数的具体名字。
- EXPORTS
- f1
- f2
mydll.h
- #ifndef _TEST_H
- #define _TEST_H //防止重复引用
-
- #include "tchar.h" //为了使用_T
-
- int f1(TCHAR *sz,int n);
- void f2();
-
- #endif
mydll.cpp
- int f1(char *sz,int n)
- {
- MessageBoxA(0,sz,0,0);
- return n;
- }
2.12QT自身的API
2.21加载动态库文件 QLibrary myLib("mydll") //动态链接库文件的基本名:mylib 非文件名。
是否成功:isLoaded()
得到函数地址:resolve()
卸载:unload()
被加载动态库
- void Dialog::on_pushButton_clicked()
- {
- Qlibrary lib("myDll");
-
- }
2.13直接调用DLL
2.131 .lib.dll文件放入exe同一路径下。
2.132 exe文件编写:
2.1321exe工程配置文件 .pro文件 导入.lib文件
- LIBS += -L$$PWD/ ./ -lmydll
- // -L 导入库路径 相对路径 $$PWD 当前路径 -l库的基本名(没有后缀的文件名)
- LIBS += -LD:\QTPrj\build-code_qbytearray-Desktop_Qt_5_14_2_MinGW_32_bit-Debug\debug -lmydll
- // -L 导入库路径 绝对路径
2.1322exe新建.h文件,mydll.h 与DLL中的不是一个!!
ADD new...
- #ifndef MYDLL_H
- #define MYDLL_H
-
- extern "C" void f();
- #endif // MYDLL_H
2.1323 exe中.cpp文件编写
- #include "myDll.h"
-
- void MainWindow::on_pushButton_clicked()
- {
- myDLL();
- }
2.14可视化设置
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。