Как разархивировать несколько файлов с помощью InnoTools после установки? - PullRequest
0 голосов
/ 08 июня 2019

Пример сценария, который я получил от http://www.saidsimple.com/daniel/blog/117966/, и он настроен только на один почтовый индекс. Я хочу иметь возможность разархивировать любые молнии в определенном месте. Я предполагаю, что одним из подходов может быть подстановочный знак * .zip, когда имя почтового индекса может отличаться в зависимости от предыдущих вариантов установки.

Не происходит распаковки. Я пропустил определение чего-либо или процедура не настроена должным образом. В моем случае zip - это текстовые файлы, которые программа должна читать для функций.

[Setup] …
SolidCompression=true
Compression=lzma
CreateAppDir=false
DirExistsWarning=false
ShowLanguageDialog=false
CreateUninstallRegKey=no
#include <idp.iss>

[Files]
Source: "{tmp}\text.net";  DestDir: "{userappdata}\ccc"; Flags: external; Components: abc
Source: "{tmp}\HLNJ.zip";  DestDir: "{userappdata}\ccc"; Flags: external deleteafterinstall; Components: hlnj
Source: "{tmp}\HNJ.zip"; DestDir: "{userappdata}\ccc"; Flags: external deleteafterinstall; Components: hnj

[Code]
const
  SHCONTCH_NOPROGRESSBOX = 4;
  SHCONTCH_RESPONDYESTOALL = 16;
procedure InitializeWizard; ...
begin ...
end;
procedure CurStepChanged(CurStep: TSetupStep); ...
begin
  if CurStep = ssPostInstall then 
  begin ...
end;
end;

procedure unzip(ZipFile, TargetFldr: PAnsiChar);
var
 shellobj: variant;
 ZipFileV, TargetFldrV: variant;
 SrcFldr, DestFldr: variant;
 shellfldritems: variant;
begin
 if FileExists('{userappdata}\ccc\HLNJ.zip') then begin
 ForceDirectories('{userappdata}\ccc’);
 shellobj := CreateOleObject('Shell.Application');
 ZipFileV := string(ZipFile);
 TargetFldrV := string(TargetFldr);
 SrcFldr := shellobj.NameSpace(ZipFileV);
 DestFldr := shellobj.NameSpace(TargetFldrV);
 shellfldritems := SrcFldr.Items;
 DestFldr.CopyHere(shellfldritems, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL); 
 end;
end;

procedure ExtractSomething(src, target : AnsiString);
begin
 unzip(ExpandConstant(src), ExpandConstant(target));

end;

Я ожидаю, что один из молний будет расстегнут. Но ничего, даже в inno log; ничего не происходит в этом разделе кода. По крайней мере удаление почтового индекса работает.

1 Ответ

0 голосов
/ 09 июня 2019

Вы даже не можете извлечь один ZIP-файл. Так что сначала пошагово, а потом ...

Код не полный. Так что можно только догадываться, чего не хватает или что нет.

Для проверки правильности функционирования процедуры unzip вы должны использовать простую стандартную программу inno-setup.

Если это работает, вы можете добавить дополнительные функции, а затем найти ошибку проще.

Также используемые константы "src" и "target" не видны. Как они построены?

unzip(ExpandConstant(src), ExpandConstant(target));

Следует избегать использования различных типов данных.

AnsiString против PAnsiChar

procedure unzip(ZipFile, TargetFldr: PAnsiChar);
....
end;

procedure ExtractSomething(src, target : AnsiString);
begin
  unzip(ExpandConstant(src), ExpandConstant(target));
end;

Я подозреваю, что использование {tmp} будет сделано при загрузке #include idp.iss. Этот код также не существует.

Мы смоделируем это и будем использовать известный zip-файл из известного каталога. Поэтому нам не нужна загрузка файлов.

Информация также не наносит вреда, но облегчает поиск неисправности.
Для этого я использовал MsgBox ().

Простая процедура для начала следующего.

  • Скопируйте файл HLNJ.zip в C: \ HLNJ.zip и найдите часть имени файла или папки в HLNJ.zip так что мы можем проверить извлечение.
  • Я использую здесь файл с именем atext.txt, который является частью моего HLNJ.zip

CreateOleObject нужны варианты, поэтому используйте их.

 [Files]
 ; Simulate the download of HLNJ.zip is ok
 ; On the development PC .. on the client PC.
 Source: "C:\HLNJ.zip"; DestDir: "{tmp}";

 ; Now "HLNJ.zip" is in the {tmp} folder so we can use it.
 Source: "{tmp}\HLNJ.zip";  DestDir: "{userappdata}\ccc"; Flags: external deleteafterinstall

[Code]
const
  SHCONTCH_NOPROGRESSBOX = 4;
  SHCONTCH_RESPONDYESTOALL = 16;

....

procedure unzip(ZipFile, TargetFldr: variant);// <--- variant instead of PAnsiChar 
var
 shellobj: variant;
 SrcFldr, DestFldr: variant;
 shellfldritems: variant;
begin
 if FileExists(ZipFile) then begin
   if not DirExists(TargetFldr) then 
      if not ForceDirectories(TargetFldr) then begin
        MsgBox('Can not create folder '+TargetFldr+' !!', mbError, MB_OK);
        Exit;
      end;    

   shellobj := CreateOleObject('Shell.Application');
   SrcFldr := shellobj.NameSpace(ZipFile);
   DestFldr := shellobj.NameSpace(TargetFldr);
   shellfldritems := SrcFldr.Items;
   DestFldr.CopyHere(shellfldritems, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL);

   if FileExists(TargetFldr+'\atext.txt') then MsgBox('ZipFile '+ZipFile+
     ' extracted to '+TargetFldr, mbInformation, MB_OK);

 end else MsgBox('ZipFile '+ZipFile+' does not exist', mbError, MB_OK);
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then 
  begin
     unzip(ExpandConstant('{userappdata}\ccc\HLNJ.zip'),ExpandConstant('{userappdata}\ccc\extracted'));
  end;
end;

enter image description here

...