Войти

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 4]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 [94] 95 96 97 98 99 100 101 102 103 104 105

Devils Night
08-05-2012, 13:01
Такой вопрос: насчёт #define AppID, я что-то пробовал вставить AppId={{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24} вместо AppId=TheBestAppIdEverMade, компилится нормально, но выдаёт ошибку: Exception Internal error: Failed to pause "reg" constant, где грабли?
Вообще расчитываю на #define AppID "{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}"
В общем вот:
#define AppID "{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}"
#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define InExe "setup.exe"
#define UnExe "unins000.exe"

[Setup]
AppId={{#AppID}
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}


[Files]
Source: hl2.exe; DestDir: {app}\common\half-life 2; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname


[ Code]
var
Run_Button: TNewButton;
Del_Button: TNewButton;
AppPath, UninsPath: string;
ResultCode: Integer;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') then
Confirm:= False;
end;

procedure UninstallButtonClick(Sender: TObject);
begin
Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, ResultCode);
SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure RunButtonClick(Sender: TObject);
begin
Exec(AppPath + '\common\half-life 2\hl2.exe', '', '', SW_SHOW, ewNoWait, ResultCode);
SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure InitializeWizard;
begin
AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSe tting("AppID")}_is1,InstallLocation|}'));
UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSe tting("AppID")}_is1,UninstallString|}'));
{ Run_Button }
Run_Button := TNewButton.Create(WizardForm);
with Run_Button do
begin
Name := 'Run_Button';
Parent := WizardForm;
Left := ScaleX(240);
Top := ScaleY(327);
Width := ScaleX(75);
Height := ScaleY(23);
Caption := 'Запустить';
OnClick := @RunButtonClick;
Enabled := FileExists(AppPath + '\common\half-life 2\hl2.exe');
end;

{ Del_Button }
Del_Button := TNewButton.Create(WizardForm);
with Del_Button do
begin
Name := 'Del_Button';
Parent := WizardForm;
Left := ScaleX(153);
Top := ScaleY(327);
Width := ScaleX(75);
Height := ScaleY(23);
Caption := 'Удалить';
OnClick := @UninstallButtonClick;
end;

if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') then
MsgBox('Программа {#AppName} уже установлена',mbError,MB_OK);

end;

procedure CurPageChanged(CurPageID: Integer);
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') and (CurPageId=wpWelcome)
then
begin
Run_Button.Visible := True;
Del_Button.Visible := True;
WizardForm.NextButton.Caption := 'Продолжить';
end
else
begin
Run_Button.Visible := false;
Del_Button.Visible := false;
end;
end;P.S Компилится нормально, но инсталлятор не запускается.

El Sanchez
08-05-2012, 14:41
Devils Night, при раскрытии константы {#SetupSetting("AppID")} значение завершается фигурной скобкой и компилятор считает, что константа {reg} завершена на этой скобке и синтаксис рушится. Экранируй как в справке сказано:

[Setup]
AppID={{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24%7d

Devils Night
08-05-2012, 19:40
Экранируй как в справке сказано »Так не пойдёт AppID={{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24%7d, т.к в реестре так и записывается {D8E8ADA9-2E6C-49E7-924B-A32B89C23A24%7d_is1 а нужно именно AppID={{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}, потому что устройство проверяет именно этот ключ, да и с учётом скобок {}, если там другой набор, то устройство запускает свою программу.

El Sanchez
08-05-2012, 21:10
Devils Night, спасибо, ясно. Замена закрывающей фигурной скобки для препроцессорных констант на какой-нибудь другой символ ничего не дал, режим С-style препроцессора тоже. Придется использовать RegQueryStringValue.

Devils Night
08-05-2012, 21:43
El Sanchez, Если без вариантов с тем кодом, то может есть ещё какой вариант? Размер окна не имеет значения, и не обязательно чтоб был маленький, можно и стандарт.
В общем код в три кнопки, такого содержания:

#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define UnExe "unins000.exe"

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}

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

[Messages]
rus.SetupWindowTitle={#AppName}

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion nocompression;

[Icons]
Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}"
Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, "&", "&&")}}"; Flags: nowait postinstall skipifsilent

[Registry]
Root: HKLM; Subkey: "SOFTWARE\{#AppName}"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\{#AppName}"; ValueName: "Path"; ValueType: String; ValueData: "{app}\"; Flags: uninsdeletekey

[UninstallDelete]
Type: filesandordirs; Name: {app};

[ Code]
//Три кнопки - Начало скрипта
var
AppDir, unins, run: string;
ResultCode: Integer;
UninsButton, RunButton: TButton;
MyLabel: TLabel;

procedure ReadEntries;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\{#AppName}', 'Path', AppDir);
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= False;
end;

procedure Uninstall(Sender: TObject);
begin
unins:='{#UnExe}';
ReadEntries;
if not (FileExists(AddBackslash(AppDir) + unins)) then
MsgBox('Невозможно запустить деинсталляцию программы ' + ExpandConstant('{#AppName}') + ', т.к. исполняемый файл деинсталляции unins000.exe не найден.', mbCriticalError, MB_OK or MB_DEFBUTTON1)
else
Exec(AddBackslash(AppDir) + unins, '', ExtractFilePath(AddBackslash(AppDir) + unins), SW_SHOW, ewNoWait, ResultCode);
WizardForm.Close;
end;

procedure RunProgramm(Sender: TObject);
begin
run:='{#AppExeName}';
ReadEntries;
if (FileExists(AddBackslash(AppDir) + run)) then
Exec(AddBackslash(AppDir) + run, '', ExtractFilePath(AddBackslash(AppDir) + run), SW_SHOW, ewNoWait, ResultCode);
WizardForm.Close;
end;

procedure NewForm;
begin
ReadEntries;
if (RegValueExists(HKLM, 'SOFTWARE\{#AppName}', 'Path')) and (FileExists(ExpandConstant(AppDir)+'\{#AppExeName}')) then begin
with WizardForm do
begin
ClientWidth := ScaleX(395);
ClientHeight := ScaleY(120);
Bevel.Hide;
InnerNotebook.Hide;
OuterNotebook.Hide;
BorderStyle:= bsDialog;
Center;
with CancelButton do
begin
Left := WizardForm.CancelButton.Left -100;
Top := WizardForm.ClientHeight - CancelButton.Height - ScaleY(10);
BringToFront;
end;
UninsButton:= TButton.Create(WizardForm);
with UninsButton do
begin
Left := WizardForm.NextButton.Left -100;
Top := WizardForm.ClientHeight - NextButton.Height - ScaleY(10);
Width:= WizardForm.NextButton.Width;
Parent:= WizardForm;
Caption:= 'Удалить';
OnClick := @Uninstall;
BringToFront;
end;
RunButton:= TButton.Create(WizardForm);
with RunButton do
begin
Left := WizardForm.BackButton.Left -110;
Top := WizardForm.ClientHeight - BackButton.Height - ScaleY(10);
Width:= WizardForm.BackButton.Width;
Parent:= WizardForm;
Caption:= 'Запустить';
OnClick := @RunProgramm;
BringToFront;
end;
MyLabel:= TLabel.Create(WizardForm);
with MyLabel do
begin
SetBounds(10,10,380,80);
AutoSize:=False;
WordWrap:=True;
//Font.Color:=$000000;
//Font.Style:=[fsBold];
//Font.Size:=10;
Parent:=WizardForm;
Transparent:=True;
Caption:= 'Программа ' + ExpandConstant('{#AppName}') + ' уже установлена на Ваш компьютер.' +#13#13+ 'Выберите нужное действие.';
end;
end;
end;
end;

procedure InitializeWizard;
begin
NewForm;
end;
//Три кнопки - Конец скрипта


Задача: Добавить ещё одну кнопку Изменить.
Может посоветуешь какой ещё вариант?

El Sanchez
08-05-2012, 22:30
Если без вариантов с тем кодом, то может есть ещё какой вариант? Размер окна не имеет значения, и не обязательно чтоб был маленький, можно и стандарт. »
Devils Night, я в скрипт не вникал, я лишь указал на проблему в строках при GUID-ном AppID:

AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSe tting("AppID")}_is1,InstallLocation|}'));
UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSe tting("AppID")}_is1,UninstallString|}'));

..., которую можно решить, заменив раскрытие константы {reg} на функцию RegQueryStringValue:

if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'InstallLocation', AppPath) then
AppPath := RemoveQuotes(AppPath);
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', UninsPath) then
UninsPath := RemoveQuotes(UninsPath);


Добавить ещё одну кнопку Изменить. »
Кнопка должна знать где будет находиться дистрибутив во время нажатия на нее. Посмотри как реализовано в Example_Uninstall_3.iss (кнопка UModifyButton) от Restools. Плюс прикрутить AppModifyPath для понту.

Johny777
08-05-2012, 23:32
El Sanchez, R.i.m.s.k.y.,
можно пожалуйста общий вопрос?

вот 2 маленьких примера
1.

var
RichEditViewer1: TRichEditViewer; /// глобально

procedure InitializeWizard();
begin
{ RichEditViewer1 }
RichEditViewer1 := TRichEditViewer.Create(WizardForm);
with RichEditViewer1 do
begin
Name := 'RichEditViewer1';
Parent := WizardForm.SelectDirPage;
Left := ScaleX(112);
Top := ScaleY(112);
Width := ScaleX(185);
Height := ScaleY(89);
Text := '';
end;
end;

2.

procedure InitializeWizard();
var
RichEditViewer1: TRichEditViewer; /// локально

begin
{ RichEditViewer1 }
RichEditViewer1 := TRichEditViewer.Create(WizardForm);
with RichEditViewer1 do
begin
Name := 'RichEditViewer1';
Parent := WizardForm.SelectDirPage;
Left := ScaleX(112);
Top := ScaleY(112);
Width := ScaleX(185);
Height := ScaleY(89);
Text := '';
end;
end;


в первом примере
var
RichEditViewer1: TRichEditViewer; объявлен глобально
а во втором локально в InitializeWizard-е;
читал, что после выполнения процедуры переменная освобождается
Освобождаются ли переменные после инициализации (по окончании работы InitializeWizard) ?
если да, то действительно ли это влияет на производительность
.................................................................................................... ......................................
вот глянь у меня в одном RedesignWizardForm; на данный момент количество переменных

var
Mr_Valve_Label: TLabel;
Valve_Label: TLabel;
Welcome_Label_1: TLabel;
Welcome_hl2series_Label: TLabel;
BitmapImage6: TBitmapImage;
Welcome_Label_2: TLabel;
BitmapImage10: TBitmapImage;
BitmapImage11: TBitmapImage;
Part1_ScrollBox: TScrollBox;
Intro_BitmapImage1: TBitmapImage;
BitmapImage1: TBitmapImage;
BitmapImage3: TBitmapImage;
BitmapImage8: TBitmapImage;
BitmapImage7: TBitmapImage;
BitmapImage12: TBitmapImage;
BitmapImage13: TBitmapImage;
BitmapImage14: TBitmapImage;
BitmapImage15: TBitmapImage;
BitmapImage16: TBitmapImage;
BitmapImage17: TBitmapImage;
BitmapImage18: TBitmapImage;
BitmapImage19: TBitmapImage;
BitmapImage20: TBitmapImage;
BitmapImage21: TBitmapImage;
BitmapImage22: TBitmapImage;
BitmapImage23: TBitmapImage;
BitmapImage24: TBitmapImage;
BitmapImage25: TBitmapImage;
BitmapImage26: TBitmapImage;
BitmapImage27: TBitmapImage;
BitmapImage28: TBitmapImage;
BitmapImage29: TBitmapImage;
BitmapImage30: TBitmapImage;
BitmapImage31: TBitmapImage;
BitmapImage32: TBitmapImage;
BitmapImage33: TBitmapImage;
BitmapImage34: TBitmapImage;
BitmapImage35: TBitmapImage;
BitmapImage36: TBitmapImage;
BitmapImage37: TBitmapImage;
Label_Lambda: TLabel;
BitmapImage38: TBitmapImage;
BitmapImage39: TBitmapImage;
BitmapImage40: TBitmapImage;
BitmapImage41: TBitmapImage;
BitmapImage42: TBitmapImage;
BitmapImage43: TBitmapImage;
BitmapImage44: TBitmapImage;
BitmapImage45: TBitmapImage;
BitmapImage46: TBitmapImage;
BitmapImage47: TBitmapImage;
BitmapImage48: TBitmapImage;
BitmapImage49: TBitmapImage;
BitmapImage50: TBitmapImage;
BitmapImage51: TBitmapImage;
BitmapImage52: TBitmapImage;
BitmapImage53: TBitmapImage;
BitmapImage55: TBitmapImage;
BitmapImage54: TBitmapImage;
BitmapImage56: TBitmapImage;
BitmapImage57: TBitmapImage;
BitmapImage58: TBitmapImage;
BitmapImage59: TBitmapImage;
BitmapImage60: TBitmapImage;
BitmapImage61: TBitmapImage;
BitmapImage62: TBitmapImage;
BitmapImage63: TBitmapImage;
BitmapImage64: TBitmapImage;
BitmapImage65: TBitmapImage;
BitmapImage66: TBitmapImage;
BitmapImage67: TBitmapImage;
BitmapImage68: TBitmapImage;
BitmapImage69: TBitmapImage;
BitmapImage2: TBitmapImage;
BitmapImage70: TBitmapImage;
BitmapImage71: TBitmapImage;
BitmapImage72: TBitmapImage;
BitmapImage73: TBitmapImage;
BitmapImage74: TBitmapImage;
BitmapImage75: TBitmapImage;
BitmapImage76: TBitmapImage;
BitmapImage77: TBitmapImage;
BitmapImage78: TBitmapImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
RichEditViewer10: TRichEditViewer;
hl2_universe_Panel: TPanel;
L1: TLabel;
Intro_hl2_Label: TLabel;
RichEditViewer1: TRichEditViewer;
RichEditViewer3: TRichEditViewer;
RichEditViewer2: TRichEditViewer;
RichEditViewer6: TRichEditViewer;
RichEditViewer7: TRichEditViewer;
RichEditViewer8: TRichEditViewer;
RichEditViewer9: TRichEditViewer;
RichEditViewer11: TRichEditViewer;
RichEditViewer12: TRichEditViewer;
RichEditViewer13: TRichEditViewer;
RichEditViewer14: TRichEditViewer;
RichEditViewer15: TRichEditViewer;
RichEditViewer16: TRichEditViewer;
RichEditViewer17: TRichEditViewer;
RichEditViewer18: TRichEditViewer;
RichEditViewer19: TRichEditViewer;
RichEditViewer20: TRichEditViewer;
RichEditViewer21: TRichEditViewer;
RichEditViewer22: TRichEditViewer;
RichEditViewer23: TRichEditViewer;
RichEditViewer24: TRichEditViewer;
RichEditViewer25: TRichEditViewer;
RichEditViewer26: TRichEditViewer;
RichEditViewer27: TRichEditViewer;
RichEditViewer28: TRichEditViewer;
RichEditViewer29: TRichEditViewer;
RichEditViewer30: TRichEditViewer;
RichEditViewer31: TRichEditViewer;
RichEditViewer32: TRichEditViewer;
RichEditViewer33: TRichEditViewer;
RichEditViewer34: TRichEditViewer;
RichEditViewer35: TRichEditViewer;
RichEditViewer36: TRichEditViewer;
RichEditViewer37: TRichEditViewer;
RichEditViewer38: TRichEditViewer;
RichEditViewer39: TRichEditViewer;
RichEditViewer40: TRichEditViewer;
RichEditViewer41: TRichEditViewer;
RichEditViewer42: TRichEditViewer;
RichEditViewer43: TRichEditViewer;
RichEditViewer44: TRichEditViewer;
RichEditViewer45: TRichEditViewer;
RichEditViewer46: TRichEditViewer;
RichEditViewer47: TRichEditViewer;
RichEditViewer48: TRichEditViewer;
RichEditViewer49: TRichEditViewer;
RichEditViewer50: TRichEditViewer;
RichEditViewer51: TRichEditViewer;
RichEditViewer52: TRichEditViewer;
RichEditViewer53: TRichEditViewer;
RichEditViewer54: TRichEditViewer;
RichEditViewer55: TRichEditViewer;
RichEditViewer56: TRichEditViewer;
RichEditViewer57: TRichEditViewer;
RichEditViewer58: TRichEditViewer;
RichEditViewer59: TRichEditViewer;
RichEditViewer60: TRichEditViewer;
RichEditViewer61: TRichEditViewer;
RichEditViewer62: TRichEditViewer;
RichEditViewer63: TRichEditViewer;
RichEditViewer64: TRichEditViewer;
RichEditViewer65: TRichEditViewer;
RichEditViewer66: TRichEditViewer;
RichEditViewer67: TRichEditViewer;
RichEditViewer68: TRichEditViewer;
RichEditViewer69: TRichEditViewer;
RichEditViewer70: TRichEditViewer;
RichEditViewer71: TRichEditViewer;
RichEditViewer72: TRichEditViewer;
RichEditViewer73: TRichEditViewer;
RichEditViewer74: TRichEditViewer;
RichEditViewer75: TRichEditViewer;
RichEditViewer76: TRichEditViewer;
RichEditViewer77: TRichEditViewer;
RichEditViewer78: TRichEditViewer;
RichEditViewer4: TRichEditViewer;
BitmapImage5: TBitmapImage;
Trinagle_bmp: TBitmapImage;
IsCyrillicLabel: TLabel;
ListBox: TNewListBox;
hl2_ScrollBox: TScrollBox;
hl2_screens_Image: TBitmapImage;
hl2_ep1_ScrollBox: TScrollBox;
hl2_ep1_screens_Image: TBitmapImage;
hl2_ep2_ScrollBox: TScrollBox;
hl2_ep2_screens_Image: TBitmapImage;
portal_ScrollBox: TScrollBox;
portal_screens_Image: TBitmapImage;
ComponentsPage: TWizardPage;
hl2_MainLable: TLabel;
ep1_MainLable: TLabel;
ep2_MainLabel: TLabel;
BitmapImage4: TBitmapImage;
PortalC_Image: TBitmapImage;
hl2_panel: TPanel;
hl2_CheckBox: TNewCheckBox;
hl2_borealis_CheckBox: TNewCheckBox;
hl2_icon_CheckBox: TNewCheckBox;
hl2_ru_en_RadioButton: TNewRadioButton;
hl2_en_RadioButton: TNewRadioButton;
hl2_ru_RadioButton: TNewRadioButton;
hl2_buka_CheckBox: TNewCheckBox;
hl2_launch_Edit: TNewEdit;
hl2_main_CheckBox: TNewCheckBox;
hl2_ep1_panel: TPanel;
hl2_ep1_CheckBox: TNewCheckBox;
hl2_ep1_ru_en_RadioButton: TNewRadioButton;
hl2_ep1_en_RadioButton: TNewRadioButton;
hl2_ep1_ru_RadioButton: TNewRadioButton;
hl2_ep1_Icon_CheckBox: TNewCheckBox;
ep1_Launch_Edit: TNewEdit;
ep2_panel: TPanel;
hl2_ep2_CheckBox: TNewCheckBox;
hl2_ep2_ru_en_RadioButton: TNewRadioButton;
hl2_ep2_en_Radiobutton: TNewRadioButton;
hl2_ep2_ru_RadioButton: TNewRadioButton;
hl2_ep2_Icon_CheckBox: TNewCheckBox;
ep2_Launch_Edit: TNewEdit;
portal_panel: TPanel;
portal_CheckBox: TNewCheckBox;
portal_ru_en_RadioButton: TNewRadioButton;
portal_en_RadioButton: TNewRadioButton;
portal_ru_RadioButton: TNewRadioButton;
portal_Icon_CheckBox: TNewCheckBox;
portal_Launch_Edit: TNewEdit;
hl2_ep2_main_CheckBox: TNewCheckBox;
hl2_ep1_main_CheckBox: TNewCheckBox;
portal_main_CheckBox: TNewCheckBox;
SpeedBtnPanel: TPanel;
SpeedBtn: TNewSpeedButton;
TypeComboBox: TNewComboBox;
ClearButton: TNewButton;
SettingPanel: TPanel;
BitmapImage9: TBitmapImage;

а ниже ещё есть целая пачка :)
(перед компиляцией, когда время придёт, собираюсь перенести всё из этого дубликатора в InitializeWizard) и все переменные по местам (локально/глобально)
А также есть ли разница после написания
так
var
Mr_Valve_Label: TLabel;
Valve_Label: TLabel;

или так (кажется правильнее)

var
Mr_Valve_Label, Valve_Label: TLabel;

Devils Night
09-05-2012, 05:45
El Sanchez, Спасибо! Всё получилось как надо , вот что вышло:
// Скрипт 4 кнопки (Запустить|Удалить|Продолжить|Отмена|)
// Частично состоит из авторана El Sanchez (http://forum.oszone.net/member.php?userid=132675) для HL
// Модифицировал скрипт под 4 кнопки: Johny777 (http://forum.oszone.net/member.php?userid=324607)
// Поправил: El Sanchez (http://forum.oszone.net/member.php?userid=132675)

#define AppID "{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}"
#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define InExe "setup.exe"
#define UnExe "{uninstallexe}"

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}
AppId={{#AppID}

[CustomMessages]
english.Uninstall=&Uninstall
english.Run=&Run
english.Proceed=&Proceed
english.Cancel=&Cancel
english.Alreadyinstalled=The program {#AppName} is already installed
Russian.Uninstall=&Удалить
Russian.Run=&Запустить
Russian.Proceed=&Продолжить
Russian.Cancel=&Отмена
Russian.Alreadyinstalled=Программа {#AppName} уже установлена

[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl
Name: "english"; MessagesFile: "compiler:Languages\English.isl"

[Files]
Source:compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion sortfilesbyname

[ Code]
var
Run_Button: TNewButton;
Del_Button: TNewButton;
AppPath, UninsPath: string;
ResultCode: Integer;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= False;
end;

procedure UninstallButtonClick(Sender: TObject);
begin
Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, ResultCode);
SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure RunButtonClick(Sender: TObject);
begin
Exec(AppPath + '{#AppExeName}', '', '', SW_SHOW, ewNoWait, ResultCode);
SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure InitializeWizard;
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppID}_is1', 'InstallLocation', AppPath) then
AppPath := RemoveQuotes(AppPath);
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppID}_is1', 'UninstallString', UninsPath) then
UninsPath := RemoveQuotes(UninsPath);
begin
{ Run_Button }
Run_Button := TNewButton.Create(WizardForm);
with Run_Button do
begin
Name := 'Run_Button';
Parent := WizardForm;
Left := ScaleX(240);
Top := ScaleY(327);
Width := ScaleX(75);
Height := ScaleY(23);
Caption:= ExpandConstant('{cm:Run}');
OnClick := @RunButtonClick;
end;

{ Del_Button }
Del_Button := TNewButton.Create(WizardForm);
with Del_Button do
begin
Name := 'Del_Button';
Parent := WizardForm;
Left := ScaleX(153);
Top := ScaleY(327);
Width := ScaleX(75);
Height := ScaleY(23);
Caption:= ExpandConstant('{cm:Uninstall}');
OnClick := @UninstallButtonClick;
end;

if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppID}_is1') then
MsgBox(ExpandConstant('{cm:Alreadyinstalled}'),mbError,MB_OK);

if FileExists(AppPath + '{#AppExeName}') then
begin
Run_Button.Enabled:=true;
end
else
Run_Button.Enabled:=false;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppID}_is1') and (CurPageId=wpWelcome)
then
begin
Run_Button.Visible := True;
Del_Button.Visible := True;
WizardForm.NextButton.Caption:= ExpandConstant('{cm:Proceed}');
end
else
begin
Run_Button.Visible := false;
Del_Button.Visible := false;
// WizardForm.Caption := ExpandConstant(SetupMessage(msgButtonNext));
end;
end;

El Sanchez
09-05-2012, 11:34
Освобождаются ли переменные после инициализации (по окончании работы InitializeWizard) ? »
Johny777, видимо да, раз обратиться к локальной переменной извне нельзя.А также есть ли разница после написания
так
var
Mr_Valve_Label: TLabel;
Valve_Label: TLabel;
или так (кажется правильнее)
var
Mr_Valve_Label, Valve_Label: TLabel; »
Johny777, а без разницы, простое объявление переменных, но второе предпочтительней, т.к. ведет к краткости кода.

alert30
09-05-2012, 12:03
wertulll, если хочешь вот такой инсталлятор, найди "главного врача" (setup.exe <-> install.exe), распакуй сторонним программом (Universal Extractor) и там найдешь реальный скрипт install_script.iss.

R.i.m.s.k.y.
09-05-2012, 12:22
wertulll, если хочешь вот такой инсталлятор, найди "главного врача" (setup.exe <-> install.exe), распакуй сторонним программом (Universal Extractor) и там найдешь реальный скрипт install_script.iss. »
При такой распаковке не будет секции кода, а ведь именно в ней весь цимес, так что ценность распаковки околонулевая

Johny777
09-05-2012, 12:30
При такой распаковке не будет секции кода, »
а если на расширенной компилировали, то и о распаковки речи быть не может
wertulll
я ж выложил 2 страницы назад код, где только не хватает прошедшего времени
уверен его реализовать не сложно в отличии от процентов и оставшегося времени
используй его
в шапке есть отображение размера файла
ещё можно мемо добавить со списком извлекаемых файлов
будет лучше чем на скрине

habib2302
10-05-2012, 14:01
доброе время суток.короче.я хочу сделать установочник игры,а игра сама весить 1.5 гб.так вот,как сделать так чтобы был .exe и сама игра и доп софт в .bin файлах

R.i.m.s.k.y.
10-05-2012, 14:13
habib2302, да точно так же как и саму прогу
примеров в шапке тьма

habib2302
10-05-2012, 14:26
да точно так же как и саму прогу
примеров в шапке тьма »
так как сделать?

R.i.m.s.k.y.
10-05-2012, 14:29
habib2302, если с Инно на "вы и шепотом" - используй InnoIDE

habib2302
10-05-2012, 14:32
если с Инно на "вы и шепотом" - используй InnoIDE »
это именно в рразделение смотреть надо

R.i.m.s.k.y.
10-05-2012, 14:39
habib2302, ептыть, тебе разделить? тогда freearc
я с ним не работаю

alert30
10-05-2012, 17:33
habib2302, раз хочешь проБИНичить, галочи "Использовать загрузчик". А потом разбирайся.

Эх, если было бы влепено в шапке "Как разделить гиговые файлы на BIN", то я бы кричал на ура!

Johny777
10-05-2012, 18:18
"Как разделить гиговые файлы на BIN" »
Не улавливаю смысл, если честно
поподробнее скажи!




© OSzone.net 2001-2012