❶ 你好,看到你回答别人的提问,请问你知道Qt如何调用MFC的dll么
DLL与LIB的区别 :1.DLL是一个完整程序,其已经经过链接,即不存在同名引用,且有导出表,与导入表lib是一个代码集(也叫函数集)他没有链接,所以lib有冗余,当两个lib相链接时地址会重新建立,当然还有其它相关的不同,用lib.exe就知道了;2.在生成dll时,经常会生成一个.lib(导入与导出),这个lib实际上不是真正的函数集,其每一个导出导入函数都是跳转指令,直接跳转到DLL中的位置,这个目的是外面的程序调用dll时自动跳转;3.实际上最常用的lib是由lib.exe把*.obj生成的lib。(引用这里 )Qt想调用DLL怎么办呢?最先想到的是直接调用试试看:包含头文件,并把DLL文件拷到当前目录下,调用声明的函数,结果链接时和预想的一样出错了。修改Makefile.debug,的链接选项也不行。Windows里的gcc调编译时用的库是和Linux一样的.a文件。其实,上面用VC直接调用 DLL的方法,在Windows里其实叫“隐式链接”,相对的叫“显式链接”,可以参考CSDN的解释 。Qt调用DLL方法一:使用Win32 API 在显式链接下,应用程序必须进行函数调用以在运行时显式加载 DLL。为显式链接到 DLL,应用程序必须:? 调用 LoadLibrary(或相似的函数)以加载 DLL 和获取模块句柄。? 调用 GetProcAddress,以获取指向应用程序要调用的每个导出函数的函数指针。由于应用程序是通过指针调用 DLL 的函数,编译器不生成外部引用,故无需与导入库链接。? 使用完 DLL 后调用 FreeLibrary。例如:typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);HINSTANCE hDLL; // Handle to DLLLPFNDLLFUNC1 lpfnDllFunc1; // Function pointerDWORD dwParam1;UINT uParam2, uReturnVal;hDLL = LoadLibrary(”MyDLL”);if (hDLL != NULL){lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,“DLLFunc1″);if (!lpfnDllFunc1){// handle the errorFreeLibrary(hDLL);return SOME_ERROR_CODE;}else{// call the functionuReturnVal = lpfnDllFunc1(dwParam1, uParam2);}}需要说明的是,typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);是声明想要调用的函数指针,这个函数的参数必须和DLL里面的一样。DLLFunc1是DLL里面的“实际的函数名”,必须和头文件里面声明的一样,否则将会调用失败。使用需要加Windows.h 头文件。Windows里的Qt是用Mingw GCC来编译,而Mingw GCC可以支持Win32的API。使用时并不需要包含头文件。这个方法没有实际验证,理论上是可以的。Qt调用DLL方法二:使用Qt的API 对于调用DLL的方法,Qt原来本身就有相应的类来实现,用起来和Win32的步骤差不多。下面是代码,已经编译通过。在控制台依次输入qmake –project、qmake、 nmake,即可。#include#include#include//动态链接不需要包含LTM8000D.h头文件typedef int ( *pcom_open)(int , int , int ); //定义函数指针int main(int argc, char *argv[]){int ret; //函数返回值int port=1; //端口int baud=0; //波特率int rtsdtr=0; //串行口485方向控制设置:QApplication a(argc, argv);QLabel label1(”label-1″); //显示打印信息,将就着用了。。。QLabel label2(”label-2″);QLibrary mylib(”LTM8000D.DLL”);if(mylib.load()){label1.setText(”load DLL success!…”);pcom_open open=(pcom_open)mylib.resolve(”ltm_com_open”);//“ltm_com_open”为DLL包含的实际函数名,必须实际存在if(open){ ret=open(port, baud, rtsdtr); //在这里调用DLL里的函数label2.setText(”resolve ok…”);}else{label1.setText(”resolve failed…”);}}else{label2.setText(”load DLL failed…”);}label1.show();label2.show();return a.exec();}总结: 类似于调用DLL的交叉编程使用的场合很多,还可以用Qt生成DLL,给其他工具调用。说到底,VC和Qt等本质上都是一样的,只是提供了不同的C++库。
❷ qt程序打包时怎么找使用到的dll文件
因为这个库是qt的库。qt creator中可以自动找到这个库,但是windows默认是不认识这个库的。到“我的电脑->属性->高级->环境变量->系统变量”中编辑Path,补上Qt的bin 路径即可
❸ qt 怎么使用vs编写的dll
需提供管理员权限 开发过程当中程序一直都是可以运行的,但是安装到有的操作系统当中(比如:64位专业版)就运行不了了,最后“以管理员身份运行”就可以,当然简单的办法是!VS工程右键->属性->链接器->清单文件->UAC执行级别(requireAdministra…
❹ 高分求教,Qt如何加载调用win32程序编译的DLL
1.在 Pro 文件中写上 LIBS += x:/xxx/xxx/xxx.lib;2.在要用的位置写上所需要的 头文件;3.拷贝DLL到生成的exe工作目录(和Debug 、Relsese 文件夹同级目录)。
❺ Qt中如何调用delphi的DLL库文件过程
Qt是用C++开发的,用类似VC的方式调用Delphi DLL库即可。但是需要注意一点,如果Delphi DLL中包含String类型形参或实参,C++是无法调用的,需要delphi编程人员将其转换为PAnsiChar变量类型才可以调用。
❻ 高分求教,Qt如何加载调用win32程序编译的DLL
Qt提供了一个 QLibrary 类供显示调用。下面给出一个完整的例子:testDLL.dll为自定义的dll文件,将其复制到程序的输出目录下就可以调用。#include <QApplication>#include <QLibrary>#include <QDebug>#include <QMessageBox>typedef int (*Fun)(int,int); //定义函数指针,以备调用int main(int argc,char **argv){QApplication app(argc,argv);QLibrary mylib("testDLL.dll"); //声明所用到的dll文件int result;if (mylib.load()) //判断是否正确加载{QMessageBox::information(NULL,"OK","DLL load is OK!");Fun open=(Fun)mylib.resolve("add"); //援引 add() 函数if (open) //是否成功连接上 add() 函数{QMessageBox::information(NULL,"OK","Link to Function is OK!");result=open(5,6); //这里函数指针调用dll中的 add() 函数qDebug()<<result;}elseQMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!");}else{QMessageBox::information(NULL,"NO","DLL is not loaded!");return 0; //加载失败则退出}}
❼ Qt如何调用dll文件
方法有:1、用Windows系统盘功能进行文件修复;2、若在此之前有一键备份过,可以重新还原;3、从网上下载系统文件然后覆盖到原文件夹里;4、由于从网上下载系统文件,可能会因为系统文件版本与操作系统不相符造成系统文件不兼容的情况,修复系统文件最好使用专业的工具进行一键修复。5、可以用腾讯电脑管家修复下。打开电脑管家——电脑诊所——软件问题——缺少dll文件。