本篇主要讲讲以下几点:
-
在线下载
-
下载后的安装
-
下载后的解压
所用到的插件【新增】:
- inetc
- nsis7z
讲义
首先贴出今天教程的完整的例子【已测试】【附带图片】 猛击这里
题外话:最终还是决定把所有源码转移到Github上面,虽然前段时间也被GFW给封了一下,但是还是不能影响我对Git以及开源项目的热情。我相信开放的才是最光明的。
这次教程主要处理在线安装的问题,所谓的在线安装,必须要有下载和安装两部分组成,安装又分为执行或者解压两个部分,这次一次性的把安装跟解压都跟大家探讨一下
在线下载
我摸索了一下NSIS的插件,最终确定用Intec,其他的也都看过,不是功能不适合就是我没有找到源码,选择Intec其实也是勉强而为之,因为它的3个下载的样式都不适合自定义界面的要求,因为它的进度条,它的百分比都是自己已经全部包装好了的。对着丑的惨不忍睹的界面,只有叹气的份了。
怎么办?
只能改源码,打开Intec插件的C++源码,修改两点:
- 把它Dialog中的ProgressBar给隐藏掉,或者你直接把该Dialog给Hide掉也可以。
- 修改其中的传值,如果你的自定义页面CustomPage中需要有多处地方需要统一的显示百分比进度的话需要在调用Intec的时候多传一些控件进去。你就可以在代码中修改
因为我需要的只是一个进度的返回,以及ProgressBar的反应,所以所有的Intec的界面都被我Hide掉了,这里就不再贴源码了,因为我也找不到了,只找到当初Release出来的一个Dll,在给的源码包中。所有的传值方式都跟官方原版中的Intec是一样的,只是在参数中多加了几个外部组件的传入入口。
By the way想改源码的童鞋,这个Intec的源码必须在VC6下编译,VC2005及以上编译出来的在有些平台下会有异常。 嫌麻烦的话直接用给的也可以,照着例子中的调用即可。
上代码:
inetc::get /hwnd $PPercent /hwnd2 $PPercent /probar $PB_ProgressBar /caption " " /popup "" "http://download.microsoft.com/download/c/6/e/c6e88215-0178-4c6c-b5f3-158ff77b1f38/NetFx20SP2_x64.exe" "$TEMP\NetFx20SP2_x64.exe" /end
Pop $0
${If} $0 == "Transfer Error"
;MessageBox MB_OK "net64err"
Call onClickClose
Abort
${ELSEIF} $0 == "SendRequest Error"
;MessageBox MB_OK "net64err2"
Call onClickClose
Abort
${ELSE}
;System::Call "user32::InvalidateRect(i $hwndparent,i0,i 1)"
Call NFInstall64
${EndIf}
其中/hwnd /hwnd2 /probar都是自定义界面上面的组件传入参数,后面紧跟的都是自己创建的Label跟Progress:$PPercent $PB_ProgressBar
下载完成后有返回值一般等于OK即可,但是经测试不能用唯一正确的OK来判别,因为有可能下载正确但是返回值不是OK,我就用了两个最严重的错误来判别,其他的就算是下载正确了。 下载到$TEMP文件夹中,该文件夹在系统盘临时目录中,你测试的时候也可以直接设定一个目录,查看下载情况。 下载就说到这里。
下载后的安装
这里的安装当然是指譬如微软的msi,微软的exe,或者是某些可执行程序。如果你需要执行这些后缀的程序的话,最好先了解一下该执行程序所依靠的环境。例子中是用.net framework 2.0 sp2做的例子,该执行程序需要依靠Microsoft Installer 3.1的安装环境,所以例子中在这一点也做了检测,譬如安装该执行程序所需的硬盘空间,在例子中也有体现,详情可以看代码。
.net framework 2.0 sp2的安装一般人都不希望弹出对话框出来,所以需要静默安装。
nsExec::ExecToStack '"$TEMP\NetFx20SP2_x64.exe" /q /c:"install.exe /noaspupgrade /q"'
Pop $0
${If} $0 == "timeout"
Call onClickClose
Abort
${EndIf}
;MessageBox MB_OK "net64inst2"
${If} $0 == "error"
;MessageBox MB_OK "net64inst1111111"
Call onClickClose
Abort
${EndIf}
Delete "$TEMP\NetFx20SP2_x64.exe"
参数/q /c:”install.exe /noaspupgrade /q”是该执行程序的静默安装方式。 Pop出来的$0是安装结果,只有没有安装过的机器才能安装,安装过的机器都会报错,所以在安装.net framework之前需要读注册表判断一下是否安装过,例子中有。
Function NFEnvironmentCheck
ReadRegStr $1 HKLM "Hardware\Description\System\CentralProcessor\0" Identifier
StrCpy $2 $1 3
${If} $2 == 'x86'
ReadRegStr $7 HKLM 'SOFTWARE\Microsoft\Windows NT\CurrentVersion' CurrentVersion
ReadRegStr $8 HKLM 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727' Install
ReadRegStr $9 HKLM 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727' SP
${Else}
SetRegView 64
ReadRegStr $7 HKLM 'SOFTWARE\Microsoft\Windows NT\CurrentVersion' CurrentVersion
ReadRegStr $8 HKLM 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727' Install
ReadRegStr $9 HKLM 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727' SP
SetRegView lastused
${EndIf}
${If} $7 == '6.2' ;Win8
${OrIf} $7 == '6.1' ;Win7
;判断是否装了.net framework 2.0 sp2
${If} $8 == 1
${AndIf} $9 == 2
${Else}
;GetFunctionAddress $0 DisplayNFLabel
;BgWorker::CallAndWait
${If} $2 == 'x86'
StrCpy $ISNETF 1
${Else}
StrCpy $ISNETF 1
${EndIf}
${EndIf}
${ElseIf} $7 == '6.0' ;WinVista
${OrIf} $7 == '5.2' ;Win2003
${OrIf} $7 == '5.1' ;WinXP
${OrIf} $7 == '5.0' ;Win2000
;判断是否装了.net framework 2.0 sp2
${If} $8 == 1
${AndIf} $9 == 2
${Else}
${If} $2 == 'x86'
StrCpy $ISNETF 1
${Else}
StrCpy $ISNETF 1
${EndIf}
${EndIf}
${EndIf}
FunctionEnd
最后删除TEMP文件夹中的临时文件 整个安装过程就是这样的了。
下载后的解压
这一部分所需要解决的问题就是当用户需要下载自己的程序进行安装的时候,又不能自己再做一个msi的安装包吧,这样可以但是很麻烦,于是乎就直接用压缩的方式吧,这样方便。放眼压缩界7z绝对算是一个奇葩,有人做过统计,7z的压缩比是综合最好的,虽然压缩的时候比其他的压缩算法慢,但是解压却是差不多。幸好NSIS也有7z的插件 在所有工作准备好之前,你需要把你的程序通过客户端自己的7z开源软件压缩好,并且放在一个服务器上面以供下载之用。 例子中,我直接用的是7z官方的地址,作为我需要安装的软件。 下载跟之前的是一样的,这里只说解压:
SetOutPath $INSTDIR
SetOverwrite on
Nsis7z::Extract "$TEMP\7z920_extra.7z"
Delete "$TEMP\7z920_extra.7z"
把解压的路径定位于你之前设定的安装路径$INSTDIR中,调用Nsis7z::Extract命令进行解压操作,最后删除TEMP中的临时文件。 过程非常简单。
暂无评论内容