杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3254|回复: 0

Setup Factory 9 从注册表自动获得安装路径

[复制链接]
发表于 2017-1-9 21:01:59 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Share 于 2017-1-9 21:03 编辑

首先,我做的这个是补丁安装包,既然是补丁安装包,也就是对源程序进行修补,安装的时候,自然希望直接定位到源程序,而不需要用户手动去选择目录这么麻烦,虽然选好和主程序一样的默认目录也是一个办法,不过个人觉得还不够。
考虑到所有程序安装的时候,都会在注册表里面生成一个注册文件,在注册信息里面,我确实看到了输入有源程序的安装目录的键,我觉得只要取这个键的数据,然后自动输入到安装路径里面去就行了,于是我写了以下代码
  1. path = Registry.GetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\XX\\XX", "InstTo", false)
  2. SessionVar.Set("%AppFolder%", path);
复制代码

讲一下,Registry.GetValue函数是,在注册表的设定位置,从该位置的指定键里面获得数据
然后我将获得的数据返回给了path变量(这个Lua脚本莫非使用变量不需要预先定义么?好像想用什么变量就用什么,真方便)
然后我们需要将这个变量里面的数据传送给默认的安装目录,还记得我在上一讲所讲过的吧,涉及到参数的改变都需要使用SessionVar.函数系列,这里就用到了SessionVar.Set函数,作用是将%AppFolder%参数里面的数据设置成path里面的数据,
而如果你要问为什么%AppFolder%就是默认安装目录,我只能说,请认真看基础教程。
这样一来,就实现了从注册表的这个位置返回了地址给了默认安装目录的功能。

然后我发现,从这个地址不一定能返回正确的路径,因为源程序的安装程序,在某种情况下面,可能不会在这个地址写入安装地址,那怎么办?于是我想到了,只要安装了程序,就一定会产生删除文件,而删除文件的路径也会写到注册表里面,那我能不能利用这个删除文件的路径,获得安装地址呢?答案是可行的,于是我写了下面的代码
  1. path3 = Registry.GetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MajiroApp暁の護衛~罪深き終末論~", "UninstallString", false)
  2. path3 = String.TrimRight(path3, "UnInst.exe");
  3. SessionVar.Set("%AppFolder%", path3);
复制代码

第一句话不解释了,就是获得删除文件的地址
但是既然是删除地址,那么必然指向的是一个删除文件(X:\xx.exe),但是我们想要得到的是单纯的路径(X:\),那该怎么办呢,其实只要把后面的字符给删掉就可以了
String.TrimRight函数的功能便是,从指定变量的字符串右边开始,删除指定的字符串,然后返回
得到我们想要的字符串后,我们把变量里面的数据传送给了默认安装路径参数"%AppFolder%"
这样从注册表的删除文件路径获得程序安装路径的功能实现了

  1. if(SessionVar.Expand("%AppFolder%") == "")then
  2. path = Registry.GetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\しゃんぐりら\\暁の護衛~罪深き終末論~", "InstTo", false)
  3. SessionVar.Set("%AppFolder%", path);
  4. if(SessionVar.Expand("%AppFolder%") == "")then
  5. path2 = Registry.GetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MajiroApp嬇偺岇塹乣嵾怺偒廔枛榑乣", "UninstallString", false)
  6. path2 = String.TrimRight(path2, "UnInst.exe");
  7. SessionVar.Set("%AppFolder%", path2);
  8. if(SessionVar.Expand("%AppFolder%") == "")then
  9. path3 = Registry.GetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\MajiroApp暁の護衛~罪深き終末論~", "UninstallString", false)
  10. path3 = String.TrimRight(path3, "UnInst.exe");
  11. SessionVar.Set("%AppFolder%", path3);
  12. end
  13. end
  14. end
复制代码
可以看到代码中有If()then这种条件指令,功能就是用来,分辨上一条地址有木有获得,获得了就跳过,没有获得就从if里面的语句获得
然后这里有一个问题需要注意,就是这段代码贴在哪里的问题
48_222317_d8503277ef8c8a4.jpg

我们会想当然以为,既然是读取注册表的地址给默认安装目录,那就应该在选择安装目录的预加载选项卡里面的输入呗,
其实不然,因为Setup Factory奇怪的机制,如果你选择在预加载选项卡输入代码的话,你会发现,自动读取路径的功能就无法实现了,地址了空白一片,当你点了返回到许可协议页面再点下一步的时候,地址栏上面才会出现读取注册表取得地址,这个问题,我估计是因为Setup Factory优先执行页面生成函数,后执行你写的Lua脚本导致的,这点请多加注意(为了找到这个Bug,我可是不知道测试了多少遍,改了多少遍代码,当一次无意中发现返回再下一步才能实现的时候,那种欲哭无泪的感觉啊,哎)
那么怎么解决问题呢,也很简单,既然不能在这个页面的预加载里面执行,那么就到上个页面的下一步页面执行呗,
48_222317_e4cf9fc128b492d.jpg

这里也就是在许可协议的下一步选项卡里面,把这段代码打进去,让代码在选择安装页面之前就执行,这点请多加注意

然后我在后面多写了一条
  1. if (SessionVar.Expand("%AppFolder%") == "") then
  2. result = Dialog.Message("路径读取失败", "无法找到游戏的安装目录,请手动设置安装路径.", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
  3. end
复制代码

其实没啥好讲的,就是判断%AppFolder%参数里面是不是空的(用SessionVar.Expand展开%AppFolder%参数),如果是空的话,就调用Dialog.Message显示一个没有自动读取到路径的窗口。
48_222317_ccd404c58b858b6.jpg
然后我闲着无聊,在下一步选项卡里多做了一个判断,
2enmi5s.png

就是判断游戏目录下面,有木有源程序在,使用的代码如下
  1. if(SessionVar.Expand("%AppFolder%") ~= result4)then
  2. adress = File.DoesExist(SessionVar.Expand("%AppFolder%\\暁の護衛~罪深き終末論~.exe"));
  3. result2 = 6;
  4. if(adress~=true)then
  5. result2 = Dialog.Message("未找到游戏主程序", "未检测到游戏主程序,确定这里是游戏安装路径吗?", MB_YESNO, MB_ICONINFORMATION, MB_DEFBUTTON1);
  6. end
  7. end
  8.   
  9. if(result2~=7)then
  10. Screen.Next();
  11. end
复制代码

我们先不看第一句话,从第二句开始,使用了一个函数File.DoesExist(),这个函数的作用是,查看指定位置是否存在指定的文件,如果存在返回true,不存在返回false。
我利用了这条函数,根据这条函数的返回值,选择是否使用Dialog.Message,注意,这里我调用的Dialog.Message,使用了倒数第二条类型
11v6u02.png

也就是,这个信息窗口,会显示是与否的按钮,经过测试,我发现选择是的话,返回的值是6,如果选择的是否的话,返回的值是7
因此根据返回值,设置是否进入下一个页面,亦或者停留在当前页面。

你以为到此,功能就算完善了么?其实不然,我闲着蛋疼,多做了些判断
首先,许可证和选择安装目录之间,如果用户没事找事喜欢按返回,然后按下一步,然后返回,下一步,这样循环怎么办?
总不能返回,然后下一步都要选择一次目录吧
于是,我在许可证页面的下一步选项卡里面,在第一行添加了一句

  1. if(SessionVar.Expand("%AppFolder%") == "")then
  2. ...
  3. end
复制代码

也就是说
一开始就判断默认目录是否是空的,是空的就执行自动读取注册表,不是空的就跳过这些步骤

然后在选择安装目录和准备安装之间,如果用户没事找事喜欢按返回,然后按下一步,然后返回,下一步,这样循环怎么办?
于是,我在准备安装页面的返回选项卡
2md3042.png
打了这句话
result4 = SessionVar.Get("%AppFolder%");

把默认安装地址给了变量result4
然后在选择安装目录的下一步选项卡里面,在第一行添加了一句
  1. if(SessionVar.Expand("%AppFolder%") ~= result4)then
  2. ....
  3. end
复制代码


这样就能能判断地址是否有了变更,变更以后就执行接下来的判断,如果没有变更就直接跳到下一页,而不会继续跳出确认按钮。


至此关于自动读取注册表路径到默认安装路径的功能就全部讲解完毕了。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-15 04:51 , Processed in 0.131878 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表