как вернуть переменную в {src}

MaxPavlov

Мимокрокодил
Доброго время суток. Делаю кастомный выбор диска (со своим опн диалогом и привязкой к имени диска). Иду по пути зашитого окна в DLL аналога функции ShowChangeDiskWindow (isdone.dll). Вопрос в том, как вернуть измененный путь обратно в переменную инсталятора {src}.
 

vint56

Ветеран
Проверенный
MaxPavlov, я так понял ты об этом говориш
Код:
#define Name "Test"

[Setup]
SourceDir=.
OutputDir=Setup
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test
OutputBaseFilename=Setup
AllowNoIcons=true

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs createallsubdirs;

[Icons]
Name: {group}\MyProg; Filename: {app}; WorkingDir: {app}

[CustomMessages]
russian.RestoreButton=Сброс

[Code]
var
  BrowseForm: TSetupForm;
  BrowseForm2: TSetupForm;
  DirTreeView: TFolderTreeView;
  DirFolderTreeView: TStartMenuFolderTreeView;
  EditTreeView: TNewEdit;
  EditFolderTreeView: TNewEdit;
  DB_Button: TNewButton;
  GB_Button: TNewButton;
  OldEvent_NoIconsCheckClick: TNotifyEvent;

procedure DirTreeViewChange(Sender: TObject);
begin
  if DirTreeView.Directory <> WizardForm.DirEdit.Text then
  EditTreeView.Text := AddBackslash(DirTreeView.Directory) + '{#Name}' else
  EditTreeView.Text := DirTreeView.Directory;
end;

procedure DirFolderTreeViewChange(Sender: TObject);
begin
  if DirFolderTreeView.Directory <> WizardForm.GroupEdit.Text then
  EditFolderTreeView.Text := AddBackslash(DirFolderTreeView.Directory) + '{#Name}' else
  EditFolderTreeView.Text := DirFolderTreeView.Directory;
end;

procedure BrowseFormButtonsTreeViewOnClick(Sender: TObject);
begin
  case TButton(Sender).Tag of
    1: EditTreeView.Text := RemoveBackslashUnlessRoot(ExpandConstant('{#SetupSetting("DefaultDirName")}'));

    2: begin
          DirTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
          EditTreeView.Text := AddBackslash(DirTreeView.Directory) + '{#Name}';
        end;

    3: if EditTreeView.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := EditTreeView.Text;
  end;
end;

procedure BrowseFormButtonsFolderTreeViewOnClick(Sender: TObject);
begin
  case TButton(Sender).Tag of
    4: EditFolderTreeView.Text := RemoveBackslashUnlessRoot(ExpandConstant('{#Name}'));

    5: begin
          DirFolderTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
          EditFolderTreeView.Text := AddBackslash(DirFolderTreeView.Directory) + '{#Name}';
        end;

    6: if EditFolderTreeView.Text <> WizardForm.GroupEdit.Text then WizardForm.GroupEdit.Text := EditFolderTreeView.Text;
  end;
end;

procedure BrowseDirTreeViewClick(Sender: TObject);
begin
  BrowseForm := CreateCustomForm();
  with BrowseForm do
  begin
    Width := ScaleX(413);
    Height := ScaleY(361);
    Caption := SetupMessage(msgBrowseDialogTitle);
    Position := poScreenCenter;

    with TLabel.Create(nil) do
    begin
      SetBounds(ScaleX(12), ScaleY(12), ScaleX(207), ScaleY(16));
      Caption := SetupMessage(msgBrowseDialogLabel);
      Parent := BrowseForm;
      Font.Size := 8;
    end;

    DirTreeView := TFolderTreeView.Create(nil)
    with DirTreeView do
    begin
      SetBounds(ScaleX(16), ScaleY(64), ScaleX(375), ScaleY(225));
      OnChange := @DirTreeViewChange;
      Parent := BrowseForm;
    end;

    EditTreeView := TNewEdit.Create(nil);
    with EditTreeView do
    begin
      SetBounds(ScaleX(16), ScaleY(36), ScaleX(376), ScaleY(21));
      Text := DirTreeView.Directory;
      Parent := BrowseForm;
      Font.Color := clWindowText;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(16), ScaleY(301), ScaleX(90), ScaleX(23));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonCancel);
      ModalResult := mrCancel;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(111), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm;
      Caption := ExpandConstant('{cm:RestoreButton}');
      Tag := 1;
      OnClick := @BrowseFormButtonsTreeViewOnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(206), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonNewFolder);
      Tag := 2;
      OnClick := @BrowseFormButtonsTreeViewOnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(301), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonOK);
      Tag := 3;
      OnClick := @BrowseFormButtonsTreeViewOnClick;
      ModalResult := mrOk;
    end;

    DirTreeView.ChangeDirectory(AddBackslash(WizardForm.DirEdit.Text), True);
    ShowModal;
    Free;
  end;
end;

procedure BrowseDirFolderTreeViewClick(Sender: TObject);
begin
  BrowseForm2 := CreateCustomForm();
  with BrowseForm2 do
  begin
    Width := ScaleX(413);
    Height := ScaleY(361);
    Caption := SetupMessage(msgBrowseDialogTitle);
    Position := poScreenCenter;

    with TLabel.Create(nil) do
    begin
      SetBounds(ScaleX(12), ScaleY(12), ScaleX(207), ScaleY(16));
      Caption := SetupMessage(msgBrowseDialogLabel);
      Parent := BrowseForm2;
      Font.Size := 8;
    end;

    DirFolderTreeView := TStartMenuFolderTreeView.Create(nil)
    with DirFolderTreeView do
    begin
      SetBounds(ScaleX(16), ScaleY(64), ScaleX(375), ScaleY(225));
      SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{userstartup}'),ExpandConstant('{commonstartup}'));
      OnChange := @DirFolderTreeViewChange;
      Parent := BrowseForm2;
    end;

    EditFolderTreeView := TNewEdit.Create(nil);
    with EditFolderTreeView do
    begin
      SetBounds(ScaleX(16), ScaleY(36), ScaleX(376), ScaleY(21));
      Text := DirFolderTreeView.Directory;
      Parent := BrowseForm2;
      Font.Color := clWindowText;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(16), ScaleY(301), ScaleX(90), ScaleX(23));
      Parent := BrowseForm2;
      Caption := SetupMessage(msgButtonCancel);
      ModalResult := mrCancel;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(111), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm2;
      Caption := ExpandConstant('{cm:RestoreButton}');
      Tag := 4;
      OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(206), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm2;
      Caption := SetupMessage(msgButtonNewFolder);
      Tag := 5;
      OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(301), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm2;
      Caption := SetupMessage(msgButtonOK);
      Tag := 6;
      OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
      ModalResult := mrOk;
    end;

    DirFolderTreeView.ChangeDirectory(AddBackslash(WizardForm.GroupEdit.Text), True);
    ShowModal;
    Free;
  end;
end;

procedure NoIconsCheckClick(Sender: TObject);
begin
   OldEvent_NoIconsCheckClick(Sender);
   GB_Button.Enabled := not WizardForm.NoIconsCheck.Checked;
end;

procedure InitializeWizard();
begin
  OldEvent_NoIconsCheckClick := WizardForm.NoIconsCheck.OnClick;
  WizardForm.NoIconsCheck.OnClick := @NoIconsCheckClick;

  WizardForm.DirBrowseButton.Hide;
  DB_Button := TNewButton.create(WizardForm);
  with DB_Button do
  begin
    Parent := WizardForm.SelectDirPage;
    SetBounds(WizardForm.DirBrowseButton.Left, WizardForm.DirBrowseButton.Top, WizardForm.DirBrowseButton.Width, WizardForm.DirBrowseButton.Height - ScaleY(1));
    Caption := SetupMessage(msgButtonBrowse);
    OnClick := @BrowseDirTreeViewClick;
  end;

  WizardForm.GroupBrowseButton.Hide;
  GB_Button := TNewButton.create(WizardForm);
  with GB_Button do
  begin
    Parent := WizardForm.SelectProgramGroupPage;
    SetBounds(WizardForm.GroupBrowseButton.Left, WizardForm.GroupBrowseButton.Top, WizardForm.GroupBrowseButton.Width, WizardForm.GroupBrowseButton.Height - ScaleY(1));
    Caption := SetupMessage(msgButtonBrowse);
    OnClick := @BrowseDirFolderTreeViewClick;
  end;

end;
 

MaxPavlov

Мимокрокодил
Вот об этом: (из скрипта распаковки с помощью ISDone в секции)
if not ShowChangeDiskWindow ('Пожалуйста, вставьте первый диск и дождитесь его инициализации.', ExpandConstant('{src}'),'1.bin') then break;
после
if not IS7ZipExtract ( 0, 0, ExpandConstant('{src}\1.bin'), ExpandConstant('{app}\'), false, '') then break;
однако caption:=ExpandConstant('{src}\1.bin'); показывает старый, локальный путь, а IS7ZipExtract распаковывает уже по новому пути.

Моя форма из DLL
Код:
  uses
// форма со своими компонеттами treeView, поиском диска по VolumeName
  Unit1 in 'Unit1.pas' {Form2};

function MyShowChangeDiskWindowEX(Text, DefaultPath, SearchFile, VolName:AnsiString):boolean;
begin
if (FileExists(DefaultPath+'\'+SearchFile) then begin result:=true; break; end;
Form2 := TForm2.Create(Application);
Form2.Show;

Form2.TextInf:=Text;
Form2.DeftPath:=DefaultPath;
Form2.SPath:=SearchFile;
Form2.Vollname:=VolName;

while Form2.Showing do begin
   if (FileExists(Form2.NewPath+'\'+SearchFile)) then begin
     // здесь необходимо передать переменку Form2.NewPath обратно в инсталятор
     Form2.close;
     result:=true;
     break;
   end;
  Application.ProcessMessages;
end;
end;

exports MyShowChangeDiskWindowEX;
 
Последнее редактирование:

MaxPavlov

Мимокрокодил
вобщем передавал пути используя и указатели, и с помощью callback функции, и просто отдельной процедурой. Везде итог один и тот же. После нескольких обращений переменные терялись access violations и read error. Строки передаю в виде AnsiString. Пишу все под BD7. Самое интерестное, то что dll под управлением програмы написанной на самой BD7, работает адекватно, а при включении в инсталлятор начинает, через раз, сыпать ошибками или просто отключаться. Грешу на дельфийский менеджер памяти и на свои кривые руки. А на чем собственно писать dll чтобы было совместимо с innoSetup 5.5.1?
 

Shegorat

Lord of Madness
Администратор
MaxPavlov
Покажи полный исходный код. Может чем помогу.
 

MaxPavlov

Мимокрокодил
ну какой там исходный код: две формы, таймер и пара функций. СТЫДНО товарищи! Вобщем проблема с нестабильности была в использовании AnsiString. Автор ISDone кудесник, но у меня стабильно работает только на указателях PChar, что вобщем не удивительно. Борленд рекомендует использовать PChar либо ShortString 'в то время, как космические карабли...'
 
Сверху