论坛风格切换切换到宽版
  • 1555阅读
  • 0回复

[已解决]请教老虎版主 64 注册表备份,还原问题 [复制链接]

上一主题 下一主题
离线546242502
 

发帖
332
金钱
-3060
威望
-306
只看楼主 倒序阅读 0 发表于: 2015-10-28
最近汉化了 ACDSee Pro 7 ,先前想用 Inno 实现仿原版打包,请教怎么隐藏任务栏图标,一直没实现,不过在 NSIS 实现非常容易;
链接: http://pan.baidu.com/s/1hqCqjLq 密码: za9z

现在想做个自动注册程序,顺便备份注册表等,以便用户还原,老虎版主您提供的这两段代码都不能实现在 64 位系统备份 64 位注册表内容:
方式一:
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Code]
procedure InitializeWizard();
var iResultCode: Integer;
appDir, regFileName, keyName: String;
begin
appDir:=ExpandConstant('{pf}\Abc'); //安装目录 abc,设置和 [Setup] 中的 DefaultDirName 一样
regFileName:= appDir+'\backup.reg'; //注册表备份文件名 backup.reg
keyName:= 'HKEY_CURRENT_USER\Software\7-Zip'; //要备份的注册表子键 HKEY_CURRENT_USER\Software\7-Zip
CreateDir(appDir);
Exec('regedit','/E "'+regFileName+'" "'+keyName+'"', '', SW_SHOWNORMAL,ewWaitUntilTerminated, iResultCode);
end;


方式二:
[Code]
// code created by gnatix
procedure ChangeRegKey(Const FromRegKey, ToRegKey: string);
var iR: Integer;
   I: LongInt;
   regFileName, keyName: String;
   regFileLines: TArrayOfString;
begin
regFileName:= ExpandConstant('{tmp}\tmp.reg');
Exec('regedit.exe', '/ae "'+regFileName+'" "'+FromRegKey+'"', '', SW_SHOW, ewWaitUntilTerminated, iR);
if LoadStringsFromFile(regFileName, regFileLines) then
for I:= 0 to GetArrayLength(regFileLines)-1 do
   if Pos(FromRegKey, regFileLines) > 0 then
     StringChange(regFileLines, FromRegKey, ToRegKey);
   SaveStringsToFile(regFileName, regFileLines, False);
   Exec('regedit.exe', '/sc "'+regFileName+'"', '', SW_SHOW, ewWaitUntilTerminated, iR);
end;

// 安装文件前将 HKEY_CLASSES_ROOT\.pdf 复制到 HKEY_CLASSES_ROOT\.pdf_backup
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then
if RegKeyExists(HKEY_CLASSES_ROOT, '.pdf') then
   ChangeRegKey('HKEY_CLASSES_ROOT\.pdf','HKEY_CLASSES_ROOT\.pdf_backup');
end;

// 卸载软件后将 HKEY_CLASSES_ROOT\.pdf_backup 重新更改为 HKEY_CLASSES_ROOT\.pdf
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usPostUninstall then
if RegKeyExists(HKEY_CLASSES_ROOT, '.pdf_backup') then
   begin
   ChangeRegKey('HKEY_CLASSES_ROOT\.pdf_backup','HKEY_CLASSES_ROOT\.pdf');
   RegDeleteKeyIncludingSubkeys(HKEY_CLASSES_ROOT, '.pdf_backup');
   end;
end;

解决办法:
参考安装目录下 Examples 中的 64BitTwoArch.iss  脚本示例:
http://stackoverflow.com/questions/4833831/inno-setup-32bit-and-64bit-in-one