|
NSIS日常使用 windows下使用nsis
1.nsis简介
NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。NSIS 通过它的脚本语言来描述安装程序的行为和逻辑的。NSIS 的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的。
2.目录介绍
1.1 关于 NSIS - NSIS 用户手册 - 开发文档 - 文江博客 (wenjiangs.com)
3.NSIS语法
!define NAME "test" 宏定义NAME为test
!include "common.nsh" 包含头文件
VIProductVersion "1.0.0.0" //产品版本
VIAddVersionKey /LANG=2052 "ProductName" "Demo01" //产品名称
VIAddVersionKey /LANG=2052 "CompanyName" "MyCompany" //公司名称
VIAddVersionKey /LANG=2052 "ProductVersion" "1.0.0.0" //产品版本
VIAddVersionKey /LANG=2052 "LegalCopyright" "2014 China" //版权
VIAddVersionKey /LANG=2052 "FileDescription" "Demo01 安装程序" //文件说明
VIAddVersionKey /LANG=2052 "FileVersion" "1.0.0.0" //文件版本
var ShortCutPath //自定义变量
StrCpy $ShortCutPath "C:\Program Files (x86)" //变量赋值
OutFile "20221023_test.exe" //生产的exe的名称
RequestExecutionLevel admin //安装安装包时使用管理员权限
RequestExecutionLevel user //安装安装包时使用当前用户权限
SetShellVarContext current //将操作应用到当前用户(配合RequestExecutionLevel使用)
SetShellVarContext all //将操作应用到所有用户(配合RequestExecutionLevel使用)
Icon "icon/logo.ico" //安装程序图标(相对路径)
UninstallIcon "icon/unlogo.ico" //卸载程序图标
System::Call "game.exe" //操作系统调用,可以调用一些系统接口
System::Call "Kernel32::GetUserDefaultUILanguage(v ..) i .s" //获取系统当前用户的用户 UI 语言
//设置默认变量(总共有20个默认变量可用,遵循堆栈操作规则,后进先出)
Push $0 //设置
Push $1 //设置
Pop $1 //释放
Pop $0 //释放
ReadINIStr //读取ini文件
ReadRegStr $INSTDIR_REG HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\..." "InstallDir"//读取注册表InstallDir的值到INSTDIR_REG中
WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\..." "isupdate" 1 //写注册表
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\..." //删除注册表
添加卸载信息到控制面板
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\test" "InstallDir" "c:\\temp\tempdir" //安装路径
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\test" "DisplayName" "test" //程序名称
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\test" "UninstallString" "c:\\temp\uninst.exe" //卸载路径
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\test" "DisplayIcon" "c:\\temp\icon.ico" //图标
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\test" "Publisher" "公司名" //公司名
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\test" "DisplayVersion" "1.0.0.0" //版本号
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\test" "InstallDate" "20221023" //安装时间
添加开机启动
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "test" "c:\\temp\tempdir\temp.exe"
Function startinstall
code
....
FunctionEnd
call startinstall //调用代码块
Delete "c:\temp.txt" //删除文件
RMDir "c:\\temp" //删除文件
CreateDirectory "c:\\temp"
MessageBox MB_OKCANCEL|MB_ICONQUESTION|MB_TOPMOST|MB_DEFBUTTON1 "this is a test" IDOK +2 //messagebox弹出
SetOutPath "xxxx" //设置文件释放目录
//nsis待充分填写
Nsis7z::ExtractWithCallback "c:\\temp" $R9 //解压到指定目录
ExecWait "c:\\temp\password.exe" //安装某个exe
参数 /quiet /very slient /s 静默安装
注册dll和ocx
RegDLL c:\\temp\capicom.dll
RegDLL c:\\\capicom1.ocx
CopyFiles /SILENT "c:\\temp\a.txt" "d:\\temp\a.txt" 从c盘复制到d盘
CreateShortCut "$DESKTOP\测试.lnk" "C:\Program Files (x86)\test\test.exe" //生成桌面快捷方式
//生成菜单栏快捷方式
nsDui::TaskbarPin "test.lnk" "HtSec.lnk" "$QUICKLAUNCH\User Pinned" 1
//卸载菜单栏快捷方式
ExecShell TaskbarUnPin "$DESKTOP\$vDESKTOP_SHORTCUT_NAME.lnk"
ExecShell TaskbarUnPin "$INSTDIR\${INST_SUBDIR}\${PRODUCT_PUBLISHER}\${EXE_DIR}\${EXE_NAME}.lnk"
ExecShell taskbarunpin "$DESKTOP\$vDESKTOP_SHORTCUT_NAME.lnk"
${StdUtils.InvokeShellVerb} $0 "$LOCALAPPDATA\${INST_SUBDIR}\${PRODUCT_PUBLISHER}\${EXE_DIR}" "${EXE_NAME}" ${StdUtils.Const.ShellVerb.UnpinFromTaskbar}
//解决普通命令无法卸载菜单栏快捷方式的解决办法
WriteUninstaller "$INSTDIR\${INST_SUBDIR}\${NAME}\${UINST_EXE_NAME}" //生成卸载程序
ExecShell "open" "www.baidu.com" //执行shell脚本,打开百度
SendMessage 发送系统消息
SetErrorLevel
4.定制库的开发及使用
4.1定制dll
用vs创建一个dll工程
4.1.1包含头文件
#include <windows.h>
#include <commctrl.h>
#include <stdarg.h>
#include <tchar.h>
4.1.2输入
HINSTANCE g_hInstance;
HWND g_hwndParent;
extra_parameters* g_pluginParms = NULL;
#define NSMETHOD_INIT(parent)
{
g_pluginParms = extra;
g_hwndParent = parent;
EXDLL_INIT();
}
4.1.3添加测试代码
// NSIS插件导出函数,NSIS规定函数声明格式如下:
extern "C" __declspec(dllexport) void __cdecl
add ( HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
{
NSMETHOD_INIT(hwndParent);
{
// == 添加自己代码
int i = popint();
int j = popint();
int k = i + j;
MessageBox(NULL, _T("检查开始"), _T("提示"), MB_OK | MB_TASKMODAL);
pushint(k);
// ==
}
}
4.1.4编译
编译,并将dll放到nsis/Plugins 目录下
4.2调用
在nsis合适位置,添加调用
(假定dll名为 test.dll)
test::add 1 2
Pop $0
${If} $0 == 3
MessageBox MB_ICONEXCLAMATION|MB_TOPMOST "dll内函数调用成功返回计算结果3" /SD IDOK
${EndIf}
|
|