Q 如何使用C++开发插件,示例
环境:VS2013Update4参考资料[3]来做
S1:新建一个空的C++DLL项目,nsMessageBoxPlugin.
S2:复制“C:\Program Files (x86)\NSIS\Unicode\Examples\Plugin\nsis”文件夹到当前solution下。
S3:当前project头文件和库文件搜索路径设为“$(SolutionDir)nsis;”
S4:把nsis中的头文件加到当前project中。
S5:为当前project添加nsMessageBoxPlugin.c文件。源文件清单如下。
S6:把project生成的“nsMessageBoxPlugin.dll”复制到“C:\Program Files (x86)\NSIS\Unicode\Plugins”路径下。
S7:现在运行NSIS脚本应该能看到效果了。
S8:自动复制动态链接库免得每次编译都要手动复制一遍(要求关闭操作系统的UAC)。
把下面三行代码复制到“[Configuration Properties]->[BuildEvents]->[Post Build Event]”
echo on
copy "$(OutDir)$(TargetName)$(TargetExt)" "C:\Program Files (x86)\NSIS\Unicode\Plugins"
echo off
Q 桌面快捷方式,示例
在section "install"中添加下面的代码,新建shortcutCreateShortcut "$DESKTOP\${APPNAME}.lnk" "$INSTDIR\${APPEXENAME}"
在section "uninstall"中添加下面的代码,删除shortcut
delete "$DESKTOP\${APPNAME}.lnk"
Q 关闭正在运行的程序,示例
!include logiclib.nsh 不可少,引入后才能写${If}等逻辑判断。Q 判断己安装程序版本,示例
我使用的方法是:利用NSIS官网中的VersionCompare函数,比较EXE中的版本。
Q 设置升级安装路径为上次的安装路径
从注册表中读取上次的安装路径ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "MainProgramLocationPath"
在安装section中把安装路径写进去
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "MainProgramLocationPath" "$INSTDIR"
Q 如何使用变量,示例
声明Var IsSkipCustom
初始化
Strcpy $IsSkipCustom 0
修改值
Strcpy $IsSkipCustom 1
判断
IntCmp $IsSkipCustom 1 skipCustom
;这里若干行代码
skipCustom:
;不等于1就跳到这里来了。
Q 如何保留用户原来的数据
Q 如何注册控件
RegDLL "$INSTDIR\XXX.ocx"
UnRegDLL "$INSTDIR\XXX.ocx"
Q 如何安装MSXML
或采用下面的代码,quiet方式运行xml4的msi安装包。
如何判断已经装过的msi软件,guid可以从老的msi里去拿
Q 如何调用静默卸载?
如何防止启动多个安装实例
在Function .onInit中使用一面代码段
参考资料
[1]NSIS进阶教程--制作仿酷狗安装包
http://home.xtzj.com/forum.php?mod=viewthread&tid=610259
[2]NSI脚本编辑器
http://az.eliang.com/aq_2013030724.html
[3]Writing a NSIS plugin
http://clseto.mysinablog.com/index.php?op=ViewArticle&articleId=1910084
http://blog.csdn.net/lee353086/article/details/46349157