Inno setup Inno安装程序-如何在安装程序开始之前复制文件?

Inno setup Inno安装程序-如何在安装程序开始之前复制文件?,inno-setup,Inno Setup,我需要在Inno安装程序启动之前或在“选择目录”页面之前将文件复制到一个文件夹中。我希望此文件是从安装程序复制的,而不是从外部源复制的 我正在使用以下代码: 函数NextButtonClickPageID:Integer:Boolean; 开始 结果:=真; 如果PageId=wpWelcome,则 开始 文件副本 ExpandConstant'file.exe', ExpandConstant'{reg:HKCU\SOFTWARE\XXX,InstallPath}\file.exe',fals

我需要在Inno安装程序启动之前或在“选择目录”页面之前将文件复制到一个文件夹中。我希望此文件是从安装程序复制的,而不是从外部源复制的

我正在使用以下代码:

函数NextButtonClickPageID:Integer:Boolean; 开始 结果:=真; 如果PageId=wpWelcome,则 开始 文件副本 ExpandConstant'file.exe', ExpandConstant'{reg:HKCU\SOFTWARE\XXX,InstallPath}\file.exe',false; 终止 终止
您需要先将文件解压缩到一个临时目录,然后将其复制到所需的位置。像这样的方法应该会奏效:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "MyProg.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{5820E516-8DD7-4481-A016-63D3F00438C8}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, "&", "&&")}}"; Flags: nowait postinstall skipifsilent


[Code]
function InitializeSetup: Boolean;
var
  S: AnsiString;
begin
  // Show the contents of Readme.txt (non Unicode) in a message box
  log('Before Extract');
  ExtractTemporaryFile('myprog.exe');
  log('Before FileCopy. Dest:' + ExpandConstant('{reg:HKCU\SOFTWARE\XXX,InstallPath}\file.exe'));
  log('temp: ' + ExpandConstant('{tmp}\myprog.exe'));
  FileCopy(ExpandConstant('{tmp}\myprog.exe'), ExpandConstant('{reg:HKCU\SOFTWARE\XXX,InstallPath}\file.exe'), false);
  log('After FileCopy');
  Result := True;
end;

要在需要时从安装档案中提取文件,必须使用以下步骤。此过程将文件从节提取到安装应用程序使用的临时目录,您可以在常量指定的路径上找到该目录。然后,通过展开所提到的常量,将这样的提取文件复制到目标目录

如果要在初始化安装程序时但在创建向导窗体之前执行某些操作,请使用事件函数。请注意,您甚至可以在不查看向导窗体的情况下从该功能退出安装程序,例如,如果要复制的文件非常关键。下面是一个示例代码,但首先查看它的详细信息:

[守则] 函数初始化设置:布尔; 开始 结果:=真; 提取临时文件'File.exe'; 如果FileCopyExpandConstant“{tmp}\File.exe”, ExpandConstant“{reg:HKCU\SOFTWARE\XXX,InstallPath}\File.exe”,False 然后 MsgBox'文件复制成功!',MB信息,MB_确定 其他的 MsgBox'文件复制失败!',B错误,B_好的 终止
请注意,在用户单击“下一步”开始实际安装之前,通常不赞成对用户的系统进行更改-毕竟,到那时为止,他们可能仍然希望取消安装。在HKCU中使用或修改设置也是不可取的,因为它们可能不适合您期望的用户。