2017-07-21 3 views
1

Je sais que la fonction FileCopy peut être utilisée pour copier des fichiers dans la section [Code] et cela fonctionne très bien dans la plupart des cas. Cependant, existe-t-il un moyen d'invoquer l'opération de copie de fichiers Windows native, de sorte que la boîte de dialogue de copie de fichiers Windows standard avec progression, temps restant etc est affichée (ie identique à Ctrl+C, suivi de Ctrl+V), ce qui permettra également à l'utilisateur annuler ou mettre en pause l'opération de copie en cours de processus? Ou, mieux encore, existe-t-il un moyen de répliquer des fonctionnalités similaires directement dans la section [Code]?Inno Setup appelle ou réplique opération de copie de fichier Windows natif

+2

L'API Windows SHFileOperation() (ou moins facilement IFileOperation) est ce que vous devez invoquer le code pour y parvenir. –

Répondre

1

Utilisation SHFileOperation avec FO_COPY:

type 
    TSHFileOpStruct = record 
    hwnd: HWND; 
    wFunc: UINT; 
    pFrom: string; 
    pTo: string; 
    fFlags: Word; 
    fAnyOperationsAborted: BOOL; 
    hNameMappings: HWND; 
    lpszProgressTitle: string; 
    end; 

const 
    FO_COPY   = $0002; 
    FOF_NOCONFIRMATION = $0010; 

function SHFileOperation(lpFileOp: TSHFileOpStruct): Integer; 
    external '[email protected] stdcall'; 

procedure ShellCopyFile; 
var 
    FromPath: string; 
    ToPath: string; 
    FileOp: TSHFileOpStruct; 
begin 
    FromPath := 
    ExpandConstant('{src}\data1.dat') + #0 + 
    ExpandConstant('{src}\data2.dat') + #0; 
    ToPath := ExpandConstant('{app}') + #0; 

    FileOp.hwnd := WizardForm.Handle; 
    FileOp.wFunc := FO_COPY; 
    FileOp.pFrom := FromPath; 
    FileOp.pTo := ToPath; 
    FileOp.fFlags := FOF_NOCONFIRMATION; 

    if SHFileOperation(FileOp) <> 0 then 
    begin 
    MsgBox('Copying failed.', mbError, MB_OK); 
    end; 
end; 

procedure CurStepChanged(CurStep: TSetupStep); 
begin 
    if CurStep = ssInstall then 
    begin 
    ShellCopyFile; 
    end; 
end; 

Le code est pour la version Unicode de Inno Setup.

enter image description here

+0

Merci Martin. Cela semble plutôt parfait. Est-il possible de passer plusieurs fichiers à copier? Il semble que cela soit limité à un fichier à la fois? –

+1

Bien sûr, c'est possible. Voir la documentation de la structure ['SHFILEOPSTRUCT'] (https://msdn.microsoft.com/fr-fr/library/windows/desktop/bb759795.aspx) et ma réponse éditée. En fait, j'ai eu un bug dans le code précédent. Vous pouvez utiliser une liste de fichiers ou un caractère générique pour spécifier plusieurs fichiers pour l'opération. –