2012-11-24 210 views
6

我需要你的帮助,我需要将文件复制到一个文件夹,在inno安装启动之前或在选择目录的页面之前,我希望此文件从安装程序中复制而不是从外部源复制,如果有人可以请举个例子。Inno安装程序 - 如何在安装程序启动之前复制文件?

正在使用此代码:

function NextButtonClick1(PageID: Integer): Boolean; 
begin 
    Result := True; 
    if (PageId = wpWelcome) then begin 
     FileCopy(ExpandConstant('file.exe'), ExpandConstant('{reg:HKCU\SOFTWARE\XXX,InstallPath}\file.exe'), false); 
    end; 
end; 

我希望有人给用一个例子一个更好的主意。 从现在开始感谢。

+2

注意,它通常不赞成以更改用户的系​​统,他们点击最后下一步真正开始安装前 - 毕竟,到那时他们可能还想取消。在使用或修改HKCU中的设置时,也不赞同它们,因为它们可能不适合您期望的用户。 – Miral

回答

10

取出从上建立一个文件存档,你需要你将不得不使用ExtractTemporaryFile过程的任何时间。此过程将文件从[Files]部分提取到安装应用程序使用的临时目录,您可以在{tmp}常量指定的路径上找到该目录。然后,通过扩展所提到的常量,您只需从那里将这样提取的文件复制到目标目录。

如果您想在安装程序初始化时但在创建向导窗体之前执行某些操作,请使用InitializeSetup事件函数。请注意,您甚至可以在不看到向导窗体的情况下退出该功能的设置,例如如果你要复制的文件非常重要。下面是一个示例代码,而是先来看看它的commented version的一些细节:

[Code] 
function InitializeSetup: Boolean; 
begin 
    Result := True; 
    ExtractTemporaryFile('File.exe'); 
    if FileCopy(ExpandConstant('{tmp}\File.exe'), 
    ExpandConstant('{reg:HKCU\SOFTWARE\XXX,InstallPath}\File.exe'), False) 
    then 
    MsgBox('File copying succeeded!', mbInformation, MB_OK) 
    else 
    MsgBox('File copying failed!', mbError, MB_OK) 
end; 
3

您需要先将文件解压缩到临时目录,然后将其复制到所需的位置。像这样的东西应该工作:

; 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; 
相关问题