function ExtractFileFromCABToPath(CabFileName, FileNameInCAB, DestinationPath: string): Boolean; var vCAB: TJvCABFile; vCnrCabItems: Integer; Files: TStrings; vTmpMethod: TObject; { function GetWithSelf(const pr: TOnExtracted): TObject; begin Result := TMethod(pr).Data; end; } begin Result := False; vuCabEventer.OnAnyEvent(EM_Before, CabFileName, FileNameInCAB, DestinationPath, ''); try vCAB := TJvCABFile.Create(nil); try vCAB.FileName := CabFileName; // vCAB.OnCABInfo // vCAB.OnFilesListed vCAB.OnFileExtracted := vuCabEventer.OnFileExtracted; vCAB.OnStartFileExtraction := vuCabEventer.OnStartFileExtraction; // vCAB.OnNeedNewCabinet if (FileNameInCAB <> '*') and (vCAB.Files.IndexOf(FileNameInCAB) < 0) then Exit; ForceDirectories(DestinationPath + ExtractFilePath(FileNameInCAB)); if FileNameInCAB <> '*' then begin Result := vCAB.ExtractFile(FileNameInCAB, DestinationPath) and FileExists(DestinationPath + FileNameInCAB) end else begin Files := vCAB.Files; for vCnrCabItems := 0 to Files.Count - 1 do ForceDirectories(DestinationPath + ExtractFilePath (Files.Strings[vCnrCabItems])); vCAB.ExtractAll(DestinationPath); end; vuCabEventer.OnAnyEvent(EM_After, CabFileName, FileNameInCAB, DestinationPath, ''); Result := True; finally vCAB.Destroy; end; except on E: Exception do begin vuCabEventer.OnAnyEvent(EM_OnException, CabFileName, FileNameInCAB, DestinationPath, E.message); Exit; end; end; end;