添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本次安装包的实现方式: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(./)

但是这里的路径指的是当前卸载程序所在的路径,如果卸载程序所在目录下缺少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\),然后安装程序或者卸载程序所依赖的文件,都是在该临时目录下。

02_NSIS_使用MD5.dll1. md52. 官网例子3.结果展示 1. md5 从官网下载md5.dll,将dll文件放置在NSIS的安装目录下/Plugins文件中, md5可以加密字符串、文字、生成随机数等功能。 2. 官网例子 ;输出文件为md5test.ex OutFile "md5test.exe" ;展示安装细节 ShowInstDetails show Section #生成字符串的MD5sum md5dll::GetMD5String "md5me" Pop $0 https://sourceforge.net/projects/sevenzip/files/7-Zip/15.05/ https://jaist.dl.sourceforge.net/project/sevenzip/7-Zip/15.05/7z1505.exe https://jaist.dl.sourcef...
NSIS是一个功能强大的安装卸载包制作工具,通过dll可以扩展很多功能,你也可以自定义一个dll,以下是具体步骤: 1.新建一个mfc dll(本例Hello.dll) 1.1 添加对nsis库的引用: 在Hello.cpp中声明对nsis库的引用: // Hello.cpp : 定义 DLL 的初始化例程。 #include "stdafx.h" #include "He
System::Call 'F:\Ds40xxSDK::InitDSPs() i().r0' ;初始化芯片,函数: int __stdcall InitDSPs() System::Call 'F:\Ds40xxSDK::GetBoardCount(
icon ".\xxx.ico" #设置图标 OutFile "setup.exe" #设置生成程序 SilentInstall silent #静默安装不出现任何NSIS自带界面
前端时间在做安装程序时,需要自定义安装界面代替传统的打包工具制作的安装界面。毕竟打包工具制作的界面定制麻烦也比较丑。我们可以使用第三方界面库写安装程序,再在NSIS脚本中调用即可。 采用NSIS + QT 制作安装程序实际上就是使用QT制作安装程序,而NSIS仅仅将制作的安装程序打包成一个exe。 1.核心NSIS脚本 ;这次是打包生成exe的路径 OutFile ${TheOutFile}
最近做了一个小程序,需要使用到第三方DotNet控件,使用NSIS制作安装程序。需要注册dll到GAC,想到两种解决方案: 1、在NSIS中编写Function思路:  1)获取framework安装路径;  2)调用gacutil注册dll 这种思路实现的前提是需要熟悉NSIS的语法。2、在NSIS调用bat,由bat完成注册  这种方法较为简单,但是也会有一些问题。思路:   1)把需...
1、ReadINIStr(INI文件) 作用:从ini文件的[section_name]中的entry_name读取并将值存储到用户变量$ x中。将设置错误标志,如果未找到该条目,则将$ x分配给空字符串。 ReadINIStr $0 $INSTDIR\winamp.ini winamp outname 二、外部调用 1、ReserveFile 作用:把文件保存在...
Qt DLL总结【一】-链接库预备知识 Qt DLL总结【二】-创建及调用QTDLL   Qt DLL总结【三】-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS2008+Qt4.7.4 最近看了不少QtDLL例子,总结一下如何创建和调用QT 动态链接库。 先讲一下对QT动态链接库的调用方法,主要包括: 1、显式链接DLL,调... #define DEMO_API extern "C" __declspec(dllexport) #else #define DEMO_API extern "C" __declspec(dllimport) #endif