Inno Setup - 使用语言选择器定义音乐按钮和错误?

时间:2016-12-09 19:24:38

标签: inno-setup

这是带错误的代码:

#include "Music\botva2.iss"
#include "Music\BASS_Module.iss"
[Code]
function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string;
  lpParameters: string; lpDirectory: string; nShowCmd: Integer): THandle;
  external 'ShellExecuteW@shell32.dll stdcall';

var
  LanguageForm: TSetupForm;
  SelectLabel: TNewStaticText;
  CancelButton: TNewButton;

procedure LangChange(Sender : TObject);
begin
  case TNewComboBox(Sender).ItemIndex of
    0: { English }
      begin
        SelectLabel.Caption := 'Select the language to the installation:';
        CancelButton.Caption := 'Cancel';
        LanguageForm.Caption := 'PH';
      end;
    1: { Español }
      begin
        SelectLabel.Caption := 'Selecciona el idioma de la instalación:';
        CancelButton.Caption := 'Cancelar';
        LanguageForm.Caption := 'PH';
      end;
 end;
end;

procedure SelectLanguage();
var
  OKButton: TNewButton;
  LangCombo: TNewComboBox;
  Languages: TStrings;
  Params: string;
  Instance: THandle;
  P, I: Integer;
  S, L: string;
begin
  Languages := TStringList.Create();

  Languages.Add('eng=English');
  Languages.Add('spa=Español');

  LanguageForm := CreateCustomForm;

  LanguageForm.Caption := SetupMessage(msgSelectLanguageTitle);
  LanguageForm.ClientWidth := ScaleX(240);
  LanguageForm.ClientHeight := ScaleY(125);
  LanguageForm.BorderStyle := bsDialog;
  LanguageForm.Center;

  CancelButton := TNewButton.Create(LanguageForm);
  CancelButton.Parent := LanguageForm;
  CancelButton.Left := ScaleX(140);
  CancelButton.Top := ScaleY(93);
  CancelButton.Width := ScaleY(90);
  CancelButton.Height := ScaleY(23);
  CancelButton.TabOrder := 3;
  CancelButton.ModalResult := mrCancel;
  CancelButton.Caption := SetupMessage(msgButtonCancel);

  OKButton := TNewButton.Create(LanguageForm);
  OKButton.Parent := LanguageForm;
  OKButton.Left := ScaleX(10);
  OKButton.Top := ScaleY(93);
  OKButton.Width := ScaleX(90);
  OKButton.Height := ScaleY(23);
  OKButton.Caption := SetupMessage(msgButtonOK);
  OKButton.Default := True
  OKButton.ModalResult := mrOK;
  OKButton.TabOrder := 2;

  LangCombo := TNewComboBox.Create(LanguageForm);
  LangCombo.Parent := LanguageForm;
  LangCombo.Left := ScaleX(16);
  LangCombo.Top := ScaleY(56);
  LangCombo.Width := ScaleX(206);
  LangCombo.Height := ScaleY(21);
  LangCombo.Style := csDropDownList;
  LangCombo.DropDownCount := 16;
  LangCombo.TabOrder := 1;

  SelectLabel := TNewStaticText.Create(LanguageForm);
  SelectLabel.Parent := LanguageForm;
  SelectLabel.Left := ScaleX(16);
  SelectLabel.Top := ScaleY(15);
  SelectLabel.Width := ScaleX(273);
  SelectLabel.Height := ScaleY(39);
  SelectLabel.AutoSize := False
  SelectLabel.Caption := SetupMessage(msgSelectLanguageLabel);
  SelectLabel.TabOrder := 0;
  SelectLabel.WordWrap := True;

  for I := 0 to Languages.Count - 1 do
  begin
    P := Pos('=', Languages.Strings[I]);
    L := Copy(Languages.Strings[I], 0, P - 1);
    S := Copy(Languages.Strings[I], P + 1, Length(Languages.Strings[I]) - P);
    LangCombo.Items.Add(S);
    if L = ActiveLanguage then
      LangCombo.ItemIndex := I;
    LangCombo.OnChange := @LangChange;
  end;

  if LanguageForm.ShowModal = mrOK then
  begin
    // Collect current instance parameters
    for I := 1 to ParamCount do
    begin
      S := ParamStr(I);
      // Unique log file name for the elevated instance
      if CompareText(Copy(S, 1, 5), '/LOG=') = 0 then
      begin
        S := S + '-localized';
      end;
      // Do not pass our /SL5 switch
      if CompareText(Copy(S, 1, 5), '/SL5=') <> 0 then
      begin
        Params := Params + AddQuotes(S) + ' ';
      end;
    end;

    L := Languages.Strings[LangCombo.ItemIndex];
    P := Pos('=', L);
    L := Copy(L, 0, P-1);

    // ... and add selected language
    Params := Params + '/LANG=' + L;

    Instance := ShellExecute(0, '', ExpandConstant('{srcexe}'), Params, '', SW_SHOW);
    if Instance <= 32 then
    begin
      MsgBox(
        Format('Running installer with selected language failed. Code: %d', [Instance]),
        mbError, MB_OK);
    end;
  end;
end;
function InitializeSetup(): Boolean;
var
  Language: string;
begin
  Result := True;
  Language := ExpandConstant('{param:LANG}');
  if Language = '' then
  begin
    Log('No language specified, showing language dialog');
    SelectLanguage();
    Result := False;
    Exit;
  end
    else
  begin
    Log('Language specified, proceeding with installation');
  end;
end;
procedure RedesignWizardForm;
begin
  with WizardForm do
  begin
  BorderIcons:=[];
  Bevel1.Hide;
  AutoScroll := False;
  ClientHeight := ScaleY(349);
  end;

  with WizardForm.CancelButton do
  begin
  Top := ScaleY(319);
  end;

  with WizardForm.NextButton do
  begin
  Top := ScaleY(319);
  end;

  with WizardForm.BackButton do
  begin
  Top := ScaleY(319);
  end;

  with WizardForm.WizardBitmapImage do
  begin
  Width := ScaleX(500);
  end;

  with WizardForm.WelcomeLabel2 do
  begin
  Visible := False;
  end;

  with WizardForm.WelcomeLabel1 do
  begin
  Visible := False;
  end;

  with WizardForm.WizardSmallBitmapImage do
  begin
  Left := ScaleX(0);
  Width := ScaleX(500);
  Height := ScaleY(60);
  end;

  with WizardForm.PageDescriptionLabel do
  begin
  Visible := False;
  end;

  with WizardForm.PageNameLabel do
  begin
  Visible := False;
  end;

  with WizardForm.WizardBitmapImage2 do
  begin
  Width := ScaleX(500);
  ExtractTemporaryFile('WizardForm.WizardBitmapImage2.bmp');
  Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardForm.WizardBitmapImage2.bmp'));
  end;

  with WizardForm.FinishedLabel do
  begin
  Visible := False;
  end;

  with WizardForm.FinishedHeadingLabel do
  begin
  Visible := False;
  end;
end;
procedure InitializeWizard1();
begin

  RedesignWizardForm;
  WizardForm.DiskSpaceLabel.Visible := False;
end;
procedure InitializeWizard2();
begin
  ExtractTemporaryFile('BASS.dll');
  ExtractTemporaryFile('CallbackCtrl.dll');
  ExtractTemporaryFile('botva2.dll');
  ExtractTemporaryFile('MusicButton.png');
  ExtractTemporaryFile('Music.mp3');

  BASS_Init('{tmp}\Music.mp3')
  BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4)
end;

procedure InitializeWizard();
begin
  InitializeWizard1();
  InitializeWizard2();
end;
procedure DeinitializeSetup();
begin
  BASS_DeInit; //Îñâîáîæäàåì ïðîöåññ
  gdipShutdown
end;

此代码包含语言选择器Inno Setup - How to change a label caption [or other controls in general], when selected value in combox box changes和定义音乐和音乐按钮的代码。如果我删除所有关于语言选择器,代码工作正常。问题是什么?

音乐和按钮的代码包括:botva2.iss,BASS_Module.iss,botva2.dll,CallbackCtrl.dll。

enter image description here

在语言选择器上选择接受或取消时会出现此错误。

1 个答案:

答案 0 :(得分:1)

即使通过从oc login返回DeinitializeSetup来中止设置,也会调用False

所以我猜InitializeSetup(或BASS_DeInit)失败了,因为从未调用等效的gdipShutdown

BASS_Init从未被调用时,您必须避免在DeinitializeSetup中调用代码。

BASS_Init