第 36 页 共 43 页
if (e_CtrlID == CTRL_BUTTON_06) then -- 判断是否有一个键值
BUILD = Registry.DoesKeyExist(HKEY_LOCAL_MACHINE, \ if (BUILD == true) then
Dialog.Message(\注意\该键值存在\ else if (BUILD == false) then
Dialog.Message(\注意\没有该键值\ end end end
end
新问题:要导入注册表文件
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\Software\\RealNetworks\\Preferences\\DT_Objbrokr] @=\
\注册表中用%SystemRoot%不行啊,换成c:\\windows就行了,为什么这样啊?
答:注册表的某些地方可以用 %SystemRoot%,有些地方又不行,我也不知道怎么区分。如果实在不能用,还有办法,供参考: CODE
result = SessionVar.Expand(\获得系统目录字符串
Common = result..\生成Common目录字符串,.. 为字符串连接符 Registry.SetValue(HKEY_LOCAL_MACHINE,
\这个办法笨了一点,如果有更简洁的做法,请指出。
Setup Factory 7 制作补丁初探
一直都想想试试用 Setup Factory 7 做补丁,但是人懒了不想动,直到昨天才开始仔细地看了看,小有成果,与大家分享。
一开始想用阿信的 callvpatch.dll 来调用 NSIS 的插件 vpatch.dll,但老是不成功,放弃。
不过还是要用到 VPatch:在 VPatch 主页下载 VPatch v3.1,安装好之后运行 VPatch GUI,比较两个(或多个)文件,使用 “Create EXE” 生成 exe 文件,默认文件名为 VPatch.exe,此文件内就包含了补丁的数据。
使用格式为:VPatch.exe (sourcefile) (outputfile) 例如: VPatch.exe oldver.exe newver.exe
我整了半天,发现 VPatch.exe 与待补丁的文件和补丁后的文件必须在同一目录,而且新老版本文件的文件名不能相同,否则会有错误。不知道我的判断对不对,帮助文件也写得不是很清楚,熟悉它的朋友请告诉我一声。
好了,该主角出场了,我搞了半天,终于用 Setup Factory 7 成功地实现了补丁功能。 首先,将前面得到的 VPatch.exe 加入初始文件,下面的语句就看着办了: -- 在注册表内获得原版程序的安装目录,并写入变量 %AppFolder%
InstallFolder = Registry.GetValue(HKEY_CURRENT_USER, \您的产品\安装目录\ SessionVar.Set(\ -- 将 VPatch.exe 复制到安装目录
File.Copy(SessionVar.Expand(\SessionVar.Expand(\true, true, false, true, nil); -- 备份文件
共 43 页 第 37 页
function BackupFile(filename)
Folder.Create(SessionVar.Expand(\
File.Copy(SessionVar.Expand(\SessionVar.Expand(\true, true, false, true, nil);
File.Rename(SessionVar.Expand(\SessionVar.Expand(\ end
-- 补丁失败时恢复文件
function RestoreFile(filename)
File.Copy(SessionVar.Expand(\SessionVar.Expand(\true, true, false, true, nil);
File.Delete(SessionVar.Expand(\ File.Delete(SessionVar.Expand(\ end
-- 补丁成功后删除临时文件 function DeleTempFile(filename)
File.Delete(SessionVar.Expand(\ end
-- 补丁之前判断文件是否存在以及是否正在使用 function FileExistInUse(filename)
result1 = File.DoesExist(SessionVar.Expand(\ result2 = not File.IsInUse(SessionVar.Expand(\ local result = result1 and result2; return result; -- result:
-- true = 文件存在且没有在使用 -- false = 文件不存在或正在使用 end
-- 调用 VPatch.exe 进行补丁 function PatchFile(filename) local oldver = filename..\
result = File.Run(\true);
return result; -- result: -- 0 = 成功 -- 非0 = 失败 end
-- 开始补丁
if FileExistInUse(\ -- 开始补丁前备份文件 BackupFile(\
if PatchFile(\
Dialog.Message(\成功\补丁成功。\TION, MB_DEFBUTTON1); DeleTempFile(\ -- 进入下一个屏幕
第 38 页 共 43 页
Screen.Next(); else
Dialog.Message(\错误\\错误的文件或路径,请检查。\MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1); RestoreFile(\ end else
Dialog.Message(\错误\文件不存在或正在使用。\ end;
-- 删除 VPatch.exe
File.Delete(SessionVar.Expand(\ 我的算法可能还不太完善,稍显繁琐,希望有朋友继续加以改进。
刚才添加了一个 FileExistInUse 函数,用来判断文件是否存在以及是否正在使用。 VPatch下载地址:http://www.hanzify.org/?Go=Show::List&ID=11472
VB打包工具--- setup factory 7 使用总结
最近用setup factory 7 比较多,做了一个总结. 1 不包含源代码的打包过程
按照新建工程向导 选择了 ”为从属扫描工程文件“选项(或者从“工具”菜单-->扫描VB工程) 完成向导后
删除:frm/bas/vbp/vbw等源代码文件。 保留:exe/dll/ocx等运行支持文件
然后“发布”菜单--> 构建 --> 选择打包文件名 完成打包 最后安装的文件在安装夹下就没有代码文件了。 2 修改安装步骤的屏幕和信息
“工程”菜单 --> 屏幕... -->找到需要的阶段: 安装之前,安装之时,安装之后 --> 点击 “编辑”(还有添加、移除按钮) --> 修改安装信息。
添加代码是在操作(action)子项目下 3 添加可执行文件的快捷方式 找到可执行文件(*.exe) 右键文件,
选择“文件属性...”
找到“快捷方式”tab,选择需要加快捷方式的地方,如桌面等,也能在这里加入注释文字。 4 包含DAO数据库的打包
前提:需要DAO(Date Access Object), 一般是使用data 和 Access数据库。 1 正常包含了exe文件和支持文件
2 点击 左上角的“添加文件夹引用”(或者是“工程”菜单 -->“添加文件夹引用”),加入DAO文件夹(3个文件夹)。
3 点击 左下角的 启动时( \) tab,
在事件代码中输入如下(因为7.0有个问题,在6.0不需要这样 添加)
SessionVar.Set(\ 5 程序如何在安装完成后自动调用另一个程序? 比如:安装之后,执行一个可执行文件(1.exe)
在“工程”菜单 --> 屏幕...-->操作 界面-->安装之后 在onnext 事件中。
共 43 页 第 39 页
添加操作\会出现一个新建操作对话框,第一步选择一个类别,你选择shell,第二步选择一个操作,你选择shell.execute。
if (check01) then -- 要执行的语句 Screen.Next();
Shell.Execute(SessionVar.Expand(\ else
Screen.Next(); end
6 安装前检查是否已经安装过软件?
在“工程”菜单 --> 屏幕...-->找到安装的第一个屏幕 找到preload 事件中 -- 用文件存在函数判断是否过安装软件 if File.DoesExist(\ -- 如果文件存在,提示并退出安装程序
result = Dialog.Message(\通知\\不好意思,软件已经安装过了,将退出安装.\MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
Application.Exit(); end
7 搜索各个盘符搜索文件:
查找各个盘符,返回table 类型, drives = Drive.Enumerate(); max=Table.Count(drives) for count = 1,max do
-- 要执行的语句 文件查找函数 File.Find
if( File.Find(drives[count], \ count=max+1
result = Dialog.Message(\通知\不好意思,软件已经安装过了,将退出安装程序\MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
Application.Exit(); end end
8 几个常用语句
Shell.Execute 打开文件 Dialog.Message 提示信息 File.Find 查找文件
File.DoesExist 文件是否存在
File.GetVersionInfo 获取版本信息,返回table type Application.Exit(); 退出 Screen.Next(); 下一屏幕
table.count() table type 的个数(类似枚举类型)
Drive.Enumerate 获取各个盘符,返回table type 使用类似数组 table1[1]
9 增加快捷方式时,注意设置文件的描诉别出现重名,否则一些文件将被覆盖。 如:可执行文件和帮助手册的描诉重名问题。造成只有帮助文件,无可执行文件。 10 产生错误2091,无法压缩数据库。
原因:在进程管理器中该可执行文件依旧在运行 处理:移除顺利打包。
第 40 页 共 43 页
11 更多请使用帮助,自己多用每个菜单。
Setup Factory读取注册表问题
问题:
我想在读取注册表中一个注册值,用来设置程序是否可用还是不可用 我是设置了在注册表中写入
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\\Software\\Pegasys Inc.\\TMPGEnc 4.0 XPress\\ClipEdit] \
在Setup Factory中我是这样写的。
re = Registry.GetValue(HKEY_CURRENT_USER, \Inc.\\TMPGEnc 4.0 XPress\\ClipEdit\\true);
if (re) then
DlgRadioButton.SetProperties(CTRL_RADIO_BUTTON_02, {Enabled = true}); end
可是不能实现我想要的效果。 请问我这那里错了啊!!! ddstrg答:
Registry.GetValue 获得的值是字符串,不是布尔值。 表示路径的时候要用两个斜杠 \\\\ 。
Enabled = true 是设置允许与否, Checked = true 才是设置勾选与否。
re = Registry.GetValue(HKEY_CURRENT_USER, \true);
if re==\
DlgRadioButton.SetProperties(CTRL_RADIO_BUTTON_01, {Checked = false}); DlgRadioButton.SetProperties(CTRL_RADIO_BUTTON_02, {Checked = true}); end
Setup Factory 7 实现倒计时按钮
看到 NSIS 和 Inno 都能实现 禁用按钮 - 在按钮上倒计时 - 倒计时结束后启用按钮,就想试试用 Setup Factory 7来做,果然能行的。
我用 “许可协议”这个屏幕来做,在On Preload事件里加入以下代码: -- 将“我同意...”和“我不同意...”单选框禁用及隐藏
DlgRadioButton.SetProperties(CTRL_RADIOBTN_AGREE, {Visible = false, Enabled = false}); DlgRadioButton.SetProperties(CTRL_RADIOBTN_DISAGREE, {Visible = false, Enabled = false}); -- 禁用“下一步”按钮
DlgButton.SetProperties(CTRL_BUTTON_NEXT, {Enabled = false}); -- 设置倒计时的时间 max = 10;
-- 开始计时器,间隔时间为1秒 Screen.StartTimer(1000); -- 设置“下一步”按钮的文本
DlgButton.SetProperties(CTRL_BUTTON_NEXT, { Text = \我同意(\在 On Ctrl Message 事件里加入以下代码:
-- 计时器开始后将触发名为 MSGID_ONTIMER 的 e_MsgID if e_MsgID == MSGID_ONTIMER then