2012-11-24 260 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; 
相關問題