2016-12-09 2 views
-1

Это код с ошибкой: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 '[email protected] 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

Вызывается DeinitializeSetup, даже если установка отменена путем возврата False из InitializeSetup.

Так что я думаю, что BASS_DeInit (или gdipShutdown) терпит неудачу, поскольку эквивалент BASS_Init так и не был вызван.


Вы должны избегать вызова кода в DeinitializeSetup, когда BASS_Init никогда не называлась.

var 
    BASS_Initialized: Boolean; 

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); 
    BASS_Initialized := True; 
end; 

procedure DeinitializeSetup(); 
begin 
    if BASS_Initialized then 
    begin 
    BASS_DeInit; 
    gdipShutdown; 
    end; 
end;