赞
踩
本次安装包的实现方式: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
这里先记录下踩坑的事故现场:
参考文章:
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
NSIS中,解压文件开启了另外一个线程,但是文件解压的进度又需要发送给界面,此时调用界面操作的接口(该接口直接操作界面控件),会导致安装崩溃。
解决方案:
由于是QT,可采用发送信号的方式来改变进度条的值,不会导致崩溃。
解决方案:
1)、脚本文件用其他工具打开,改好后保存,再来编译
2)、根本原因是:makensis.exe还在运行,在任务管理器关掉就可以了!
解决方案:
改用bat调用 makensisw.exe 来执行脚本,
bat的内容:“D:\Program Files (x86)\NSIS\makensisw.exe” %~dp0nsisInstall.nsi
外部调用含QT界面的dll,dll显示界面需要用到的文件(qwinwidget、qmfcapp)
下载地址:https://github.com/qtproject/qt-solutions
然后在DLL初始化时,添加下面的代码
QMfcApp::pluginInstance(hInstance);
解决方案:
在DllMain函数入口增加:QCoreApplication::addLibraryPath("./");//设置库的优先搜索路径
这个坑(This application failed to start because no Qt platform plugin could be initialized)是因为卸载程序的界面是基于QT的,但是在当前程序运行的目录下,没有对应的QT的DLL文件。
通过设置库的优先搜索路径,是可以解决这个问题的。
QCoreApplication::addLibraryPath(“./”)
但是这里的路径指的是当前卸载程序所在的路径,如果卸载程序所在目录下缺少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));
nsis制作的安装包在运行时,会把安装包里面的文件释放到一个临时目录(如:C:\Users\Kandy\AppData\Local\Temp\nsg23F1.tmp\),然后安装程序或者卸载程序所依赖的文件,都是在该临时目录下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。