当前位置:   article > 正文

NSIS + QT 制作安装包的踩坑之旅_nsis调用dll

nsis调用dll

本次安装包的实现方式:NSIS + QT(DLL)
NSIS的功能:实现安装逻辑
DLL的功能:提供QT编写的界面给NSIS调用

首先遇到的一个问题:如何在DLL中如何显示QT编写的界面。暂时先不展开,后续有时间再补充,参考文章:
https://blog.csdn.net/shuishanga/article/details/52183159
http://blog.chinaunix.net/uid-13830775-id-212501.html

这里先记录下踩坑的事故现场:

1、动态库的接口参数用了std::string或者std::vector

在这里插入图片描述
参考文章:
https://blog.csdn.net/zj510/article/details/35290505
https://blog.csdn.net/chinabinlang/article/details/80496352
https://stackoverflow.com/questions/35310117/debug-assertion-failed-expression-acrt-first-block-header
解决方案:dll改成MDD/MD

2、跨线程操作界面控件导致:

在这里插入图片描述
NSIS中,解压文件开启了另外一个线程,但是文件解压的进度又需要发送给界面,此时调用界面操作的接口(该接口直接操作界面控件),会导致安装崩溃。
解决方案:
由于是QT,可采用发送信号的方式来改变进度条的值,不会导致崩溃。

3、在VNISEdit中修改脚本文件,保存时竟然提示:

在这里插入图片描述
解决方案:
1)、脚本文件用其他工具打开,改好后保存,再来编译
2)、根本原因是:makensis.exe还在运行,在任务管理器关掉就可以了!

4、编译的时候提示“Out of memory”,代码也没看出什么内存溢出的问题

在这里插入图片描述
解决方案:
改用bat调用 makensisw.exe 来执行脚本,
bat的内容:“D:\Program Files (x86)\NSIS\makensisw.exe” %~dp0nsisInstall.nsi

5、外部调用含QT界面的dll都会遇到的问题

在这里插入图片描述
外部调用含QT界面的dll,dll显示界面需要用到的文件(qwinwidget、qmfcapp)
下载地址:https://github.com/qtproject/qt-solutions
然后在DLL初始化时,添加下面的代码
QMfcApp::pluginInstance(hInstance);

6、用windeployqt打包了所需要的dll,但是NSIS安装包启动时却提示:

在这里插入图片描述
解决方案:
在DllMain函数入口增加:QCoreApplication::addLibraryPath("./");//设置库的优先搜索路径

7、运行卸载程序,却提示非qt的平台

在这里插入图片描述
这个坑(This application failed to start because no Qt platform plugin could be initialized)是因为卸载程序的界面是基于QT的,但是在当前程序运行的目录下,没有对应的QT的DLL文件。

通过设置库的优先搜索路径,是可以解决这个问题的。

QCoreApplication::addLibraryPath(./)
  • 1

但是这里的路径指的是当前卸载程序所在的路径,如果卸载程序所在目录下缺少QT的dll,同样会有同样的错误提示。

正确的做法:

在卸载程序所依赖的由QT编写的dll的DllMain函数中,设置自身dll所在目录为库的优先搜索路径,才能彻底解决此类错误。

/获取本DLL的文件路径
TCHAR szCurrent[520] = { 0 };
HMODULE hModule = GetModuleHandle(_T("nsisQt.dll"));
if (hModule)
{
	//C:\Users\Kandy\AppData\Local\Temp\nsg23F1.tmp\nsisQt.dll
	GetModuleFileName(hModule/*NULL*/, szCurrent, _countof(szCurrent) - 1);
}
//去掉路径末尾的文件名和反斜杠
::PathRemoveFileSpec(szCurrent);

//设置库的优先搜索路径
QCoreApplication::addLibraryPath(QString::fromStdWString(szCurrent));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
小知识:

nsis制作的安装包在运行时,会把安装包里面的文件释放到一个临时目录(如:C:\Users\Kandy\AppData\Local\Temp\nsg23F1.tmp\),然后安装程序或者卸载程序所依赖的文件,都是在该临时目录下。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/112663
推荐阅读
相关标签
  

闽ICP备14008679号