接上一篇 继续使用上一篇的project 。将archive里无用的文件删除 添加咱们须要的文件进来。 c++
config是一个文本文件。 注意全部文件的 destination都是 %appfolder% ,这表明程序 安装目录 setupfactory有不少这样的 全局变量 用起来很是方便 ,获取系统环境桌面目录 %desktop% 。 这相似 win批处理命令的%windir% 咱们把目录改一下 %appfolder%\tools,这样安装时就可再建立子文件夹tools。app
咱们确确实实 想定义一个咱们本身独有的 用户体验好的 安装包 ,咱们不想千篇一概。框架
在screens ->before installing 选项卡:函数
把welcome to setup 删掉,而后在license agreement编写咱们本身的 安装许可文本: 工具
咱们须要自定义一个对话框界面 用来让用户在安装过程当中进行配置。在安装时也将针对用户的配置进行相应的处理。
添加一个咱们自定义的安装配置界面:加密
User information ,Select shortcut folder 两屏也一并删掉。 lua
在建立custom Screen的时候 “下一步”按钮的 脚本(单击 screens ->before installing -> 选中custom ->ecit->actions- >On Next 选项卡):spa
1 -- These actions are performed when the Next button is clicked. 2 -- advance to the next screen 3 --采集数据 并放到全局变量里 4 --端口 5 port = DlgEditField.GetProperties(CTRL_EDIT_01).Text; 6 --启动菜单加快捷方式 7 startup = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_01).Checked; 8 --桌面快捷方式 9 desktop = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_02).Checked; 10 --%StartupFolder% 11 runnow = DlgCheckBox.GetProperties(CTRL_CHECK_BOX_03).Checked; 12 --是否有加密狗 13 softkey=DlgCheckBox.GetProperties(CTRL_CHECK_BOX_04).Checked; 14 --Dialog.Message("title ddf",txport.Text); 15 Screen.Next();
这个很简单 就是获取几个控件的值 并赋给变量,以便在稍后的过程当中使用。.net
而后就是安装过程当中针对用户的选项进行处理 ,安装过程不就是 他自动生成的 拷文件么 。要咱们管毛线啊。我这里只是一个示范 咱们根据用户选项追加配置文件 也就是config.ini 。首先执行此代码时 文件已经复制完毕 ,配置文件的目录在 %appfolder% 写文本文件 这样便可。设计
仍是 screens-> after installing ->ecit->actions->onPreLoad:
1 -- These actions are performed before the screen is shown. 2 --安装完成 进行初始化全局变量里面的配置 3 --端口,追加配置文件 4 TextFile.WriteFromString(SessionVar.Expand("%AppFolder%\\config.ini"), "\r\nport="..port, true); 5 --有无加密狗 6 if softkey then 7 TextFile.WriteFromString(SessionVar.Expand("%AppFolder%\\config.ini"), "\r\nhardwareIdType=softkey", true); 8 end 9 10 if startup then 11 Shell.CreateShortcut("%StartupFolder%", "DcmPrintSCP", SessionVar.Expand("%AppFolder%\\NewScp.exe"), "", "%AppFolder%", "", 0, SW_SHOWNORMAL, nil, "shortcut for dcmprintscp"); 12 end 13 --根据复选框选项建立快捷方式 的代码 这样就能够了。 14 if desktop then 15 Shell.CreateShortcut("%DesktopFolder%", "DcmPrintSCP", SessionVar.Expand("%AppFolder%\\NewScp.exe"), "", "%AppFolder%", "", 0, SW_SHOWNORMAL, nil, "shortcut for dcmprintscp"); 16 end 17 18 --卸载程序有问题 必须得新建一个快捷方式 19 Shell.CreateShortcut("%AppFolder%", "shortcut_uninstall", SessionVar.Expand("%AppFolder%\\uninstall.exe"), SessionVar.Expand("\"/U:%AppFolder%\\Uninstall\\uninstall.xml\"" ), "", "", 0, SW_SHOWNORMAL, nil, "shortcut for uninstall");
须要注意的:
字符串链接 是 ..这种方式 ,并非C++里寻常的+号 也不是 VB里的& 连字符。
还有些须要注意的是 类vb 语法 并不是彻底跟vb同样 ,好比这段
if startup then
xxx
End
最后咱们须要 本身搞一个banner 我已经搞好了 ,既然作东西就要注重细节。
程序启动时显示安装许可 ,而后是用户自定义配置选项 而后是选择安装目录。而后安装程序释放咱们打包的文件到指定目录。 而后咱们的脚步根据用户定义的配置选项追加配置文件 和建立桌面快捷方式 ,而且用户没有.netFramework框架 自动安装。就这样一个安装包就作好了。像我这种需求 基本上 大部分功能我都用不完 只是冰山一角。
我在这bilibili的半天 你都不厌其烦的看完了 你再 根据本身的实际需求 , 再啃啃帮助文档 就差很少了。
2016.8.24 时至今日 应公司业务需求 没想到我又在倒腾这玩意 。有看到了之前没注意到的东西 ,就像书样 从新读一遍又是一番滋味。
我说这脚本怎么这么灵活 这么强大呢,原来这脚本名叫LUA 是一种开源的通过成熟发展的东东,而且能够与C++写的dll造成互操做调用。
只是这玩意写起来 找了半天 没什么工具 既没提示又没啥的 纯记事本的方式写 太tm蛋疼了。
你看博客的代码插入选项里都有Lua 是我两年前没发现他么
之前一直 打包系统必备项 打包系统必备项进安装包里 ,而后怎么怎么实现自动安装系统必备项。如今重要找到方式了 ,根本用不着倒腾dependencies
直接resources菜单 primer files 把.net安装文件加进去 ,界面上说了 执行的时候会自定释放到临时目录。
用注册表功能 检测.net是否安装:
1 --.net版本检测 2 3 dotnetVers=Registry.GetKeyNames(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\"); 4 if (dotnetVers~= nil) then 5 for j,k in pairs(dotnetVers) do 6 if (String.Find(k,"4.0",1,false)~= -1) then 7 dotnetVer="4.0" 8 elseif (String.Find(k,"4.5",1,false)~= -1) then 9 dotnetVer="4.5" 10 end 11 end 12 end
还有须要值得注意的是,在这个设计界面随意插入控件:
按钮的事件在这里: ,先点到action去
而后on ctr message 便是按钮事件代码:
找到附加文件的释放目录并进行自动安装,之前不知道这玩意执行时还能够带参数进行静默安装:
1 Shell.Execute(SessionVar.Expand("%TempLaunchFolder%\\NetFramework4.0.exe"), "open", " /passive", "", SW_SHOWNORMAL, true)
经过SetProperties函数更改控件的值 显示隐藏等 ,经过GetProperties 获取值。
DlgEditField.SetProperties
记住 lua 还能够调用c++扩展。
基本上经过以上手段 加上lua强大的脚本控制逻辑 还有c++扩展的配合,你要制做什么样的安装包程序应该均可以倒腾出来 。
两个字 倒腾