Здравствуйте! Сразу извиняюсь, если повторяюсь! Как в Inno сделать, чтобы при возникновении ошибки во время записи в реестр, она автоматически пропускалась?
» Inno Setup (создание инсталяционных пакетов)
Aglow51
Цитата:
- Flags: noerror;
Цитата:
при возникновении ошибки во время записи в реестр, она автоматически пропускалась?
- Flags: noerror;
serg_aka_lain, спасибо!!!
Kindly
Цитата:
Код: [no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[Code]
const
GWL_STYLE = (-16);
WS_MINIMIZEBOX = $20000;
WS_SYSMENU = $80000;
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint;
external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint;
external 'SetWindowLongA@user32.dll stdcall';
function FindWindowEx(hWndM, hWndC: LongWord; lpszClass, lpszWindow: PChar): LongWord;
external 'FindWindowExA@user32.dll stdcall';
Procedure InitializeWizard();
var
TAppHandle: HWND;
begin
TAppHandle:= FindWindowEx( 0, 0, 'TApplication', 'Setup' );
SetWindowLong(TAppHandle, GWL_STYLE,
GetWindowLong(TAppHandle, GWL_STYLE) and not WS_SYSMENU and not WS_MINIMIZEBOX);
end; [/no]
Цитата:
чтобы в панели задач не было меню по щелчку правой кнопки мыши, а также при щелчке левой кнопки мыши инсталлятор не сворачивался?-- [more]
Код: [no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[Code]
const
GWL_STYLE = (-16);
WS_MINIMIZEBOX = $20000;
WS_SYSMENU = $80000;
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint;
external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint;
external 'SetWindowLongA@user32.dll stdcall';
function FindWindowEx(hWndM, hWndC: LongWord; lpszClass, lpszWindow: PChar): LongWord;
external 'FindWindowExA@user32.dll stdcall';
Procedure InitializeWizard();
var
TAppHandle: HWND;
begin
TAppHandle:= FindWindowEx( 0, 0, 'TApplication', 'Setup' );
SetWindowLong(TAppHandle, GWL_STYLE,
GetWindowLong(TAppHandle, GWL_STYLE) and not WS_SYSMENU and not WS_MINIMIZEBOX);
end; [/no]
А что со мной, что-то подскажите?
boss911 -- а почему не в секции компонентов или тасков? Там все реализуется штатным образом, а тут думать надо.
Как сделать след. прежде чем Деинсталлировать программа должна закрыться скажем myprogram.exe
KurtWagner Вроде так, тока что Genri подкидывал скриптик
Код: Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion
function KillTaskA(ExeFileName: string): Integer;
external 'KillTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';
function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';
function InitializeUninstall(): Boolean;
begin
FileCopy(ExpandConstant('{app}\ISTask.dll'), ExpandConstant('{tmp}\ISTask.dll'), False);
Result := True;
If RunTaskA('myprogram.exe', false) then
begin
KillTaskA('myprogram.exe');
Result := True;
end else
Result := False;
end;
Код: Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion
function KillTaskA(ExeFileName: string): Integer;
external 'KillTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';
function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{tmp}\ISTask.dll stdcall delayload uninstallonly';
function InitializeUninstall(): Boolean;
begin
FileCopy(ExpandConstant('{app}\ISTask.dll'), ExpandConstant('{tmp}\ISTask.dll'), False);
Result := True;
If RunTaskA('myprogram.exe', false) then
begin
KillTaskA('myprogram.exe');
Result := True;
end else
Result := False;
end;
Я делаю ассоциацию файла (файлового расширения) но она с разу не применяется только после перезагрузки компа, но во многих программах это происходит сразу после установки программы, значит это возможно, но как это сделать?
Diawer
Попробуй так:
[Setup]
ChangesAssociations=yes
или так:
[Code]
const
SHCNF_IDLIST = $0000;
SHCNE_ASSOCCHANGED = $08000000;
procedure SHChangeNotify(wEventId, uFlags, dwItem1, dwItem2: Integer);
external 'SHChangeNotify@shell32.dll stdcall';
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0)
end;
хотя это одно и тоже
Попробуй так:
[Setup]
ChangesAssociations=yes
или так:
[Code]
const
SHCNF_IDLIST = $0000;
SHCNE_ASSOCCHANGED = $08000000;
procedure SHChangeNotify(wEventId, uFlags, dwItem1, dwItem2: Integer);
external 'SHChangeNotify@shell32.dll stdcall';
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0)
end;
хотя это одно и тоже
Sampron
Работает как надо, Спасибо.
Работает как надо, Спасибо.
Genri
Цитата:
А потому, что хочется видеть чекбоксы на финальной странице завершения установки (postinstall), а не перед, что будет логичней, когда задается вопрос о запуске установленного приложения. Забыл еще указать в своем вопросе дополнительные флаги, посему обновил сообщение.
Цитата:
Я думал, что способ уже существует или по-быстрому его можно реализовать.
Цитата:
а почему не в секции компонентов или тасков?
А потому, что хочется видеть чекбоксы на финальной странице завершения установки (postinstall), а не перед, что будет логичней, когда задается вопрос о запуске установленного приложения. Забыл еще указать в своем вопросе дополнительные флаги, посему обновил сообщение.
Цитата:
а тут думать надо
Я думал, что способ уже существует или по-быстрому его можно реализовать.
Цитата:
Kindly
Цитата:
чтобы в панели задач не было меню по щелчку правой кнопки мыши, а также при щелчке левой кнопки мыши инсталлятор не сворачивался?
-- [more][Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[Code_]
const
GWL_STYLE = (-16);
WS_MINIMIZEBOX = $20000;
WS_SYSMENU = $80000;
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint;
external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint;
external 'SetWindowLongA@user32.dll stdcall';
function FindWindowEx(hWndM, hWndC: LongWord; lpszClass, lpszWindow: PChar): LongWord;
external 'FindWindowExA@user32.dll stdcall';
Procedure InitializeWizard();
var
TAppHandle: HWND;
begin
TAppHandle:= FindWindowEx( 0, 0, 'TApplication', 'Setup' );
SetWindowLong(TAppHandle, GWL_STYLE,
GetWindowLong(TAppHandle, GWL_STYLE) and not WS_SYSMENU and not WS_MINIMIZEBOX);
end;[/more]
немного поправлю
думаю так будет правильней
[more]Procedure InitializeWizard;
var
TAppHandle: HWND;
begin
TAppHandle:=GetWindowLong(MainForm.Handle,-8);
if TAppHandle<>0 then
SetWindowLong(TAppHandle,GWL_STYLE,GetWindowLong(TAppHandle,GWL_STYLE) and not (WS_SYSMENU or WS_MINIMIZEBOX));
end; [/more]
htuos -- я был практически уверен, что должен быть штатный апишный способ, а не через FindWindow. Но знаний не хватило. Спасибо за экспириенс
boss911
Цитата:
Код: [no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[Run]
Filename: {win}\notepad.exe; Flags: postinstall skipifsilent nowait
Filename: {win}\explorer.exe; Flags: postinstall skipifsilent nowait
[Code]
function NextButtonClick(CurPageID: Integer): Boolean;
var
ResultCode: Integer;
begin
Result:= True;
if (CurPageID = wpFinished) and not WizardSilent then
begin
if WizardForm.RunList.Checked[0] or
WizardForm.RunList.Checked[1] then
Exec(ExpandConstant('{sys}\calc.exe'), '', '', SW_SHOW,
ewWaitUntilTerminated, ResultCode);
end;
end; [/no]
Цитата:
хочется видеть чекбоксы на финальной странице завершения установки (postinstall), а не перед-- согласен. [more]
Код: [no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[Run]
Filename: {win}\notepad.exe; Flags: postinstall skipifsilent nowait
Filename: {win}\explorer.exe; Flags: postinstall skipifsilent nowait
[Code]
function NextButtonClick(CurPageID: Integer): Boolean;
var
ResultCode: Integer;
begin
Result:= True;
if (CurPageID = wpFinished) and not WizardSilent then
begin
if WizardForm.RunList.Checked[0] or
WizardForm.RunList.Checked[1] then
Exec(ExpandConstant('{sys}\calc.exe'), '', '', SW_SHOW,
ewWaitUntilTerminated, ResultCode);
end;
end; [/no]
Genri
Цитата:
А как быть, если процесс должен запускаться с параметром ( -install ) командной строки?
Цитата:
Exec(ExpandConstant('{sys}\calc.exe'), '', '', SW_SHOW,
А как быть, если процесс должен запускаться с параметром ( -install ) командной строки?
Привет всем.
Проблема такова - нужно в параметры ярлыка внести слова с кавычками... Само собой Inno ругается, а по-другому работать не будет ярлык.
Вот часть кода
Код:
[Icons]
Name: {group}\Rise And Fall Война Цивилизаций; Filename: {app}\RiseAndFall.exe; WorkingDir: {app}; Parameters: -datapath "data\" -redistpath "redist\" -nodump
Проблема такова - нужно в параметры ярлыка внести слова с кавычками... Само собой Inno ругается, а по-другому работать не будет ярлык.
Вот часть кода
Код:
[Icons]
Name: {group}\Rise And Fall Война Цивилизаций; Filename: {app}\RiseAndFall.exe; WorkingDir: {app}; Parameters: -datapath "data\" -redistpath "redist\" -nodump
MaxDELETE
Попробуй так:
[Icons]
Name: {group}\Rise And Fall Война Цивилизаций; Filename: {app}\RiseAndFall.exe; WorkingDir: {app}; Parameters: -datapath """data\""" -redistpath """redist\""" -nodump
Попробуй так:
[Icons]
Name: {group}\Rise And Fall Война Цивилизаций; Filename: {app}\RiseAndFall.exe; WorkingDir: {app}; Parameters: -datapath """data\""" -redistpath """redist\""" -nodump
boss911 -- Exec(ExpandConstant('{sys}\calc.exe'), '-install', '', SW_SHOW,...
MaxDELETE
Цитата:
...Parameters: "-datapath ""data\"" -redistpath ""redist\"" -nodump"
MaxDELETE
Цитата:
Есть предложения?-- есть. Прочитать в хелпе раздел Parameters in Sections
...Parameters: "-datapath ""data\"" -redistpath ""redist\"" -nodump"
Genri, спасибо большое, просто что-то в стандартном хелпе такого не нашел изначально - не вчитывался
Genri
Огромное тебе спасибо за твою помощь.
Цитата:
Мне бы еще сюда добавить, чтобы инсталлятор не дожидался остановки приложения (nowait).
Огромное тебе спасибо за твою помощь.
Цитата:
Exec(ExpandConstant('{sys}\calc.exe'), '-install', '', SW_SHOW,
Мне бы еще сюда добавить, чтобы инсталлятор не дожидался остановки приложения (nowait).
boss911
Цитата:
Цитата:
Ну если дожидаться окончания не надо, замени ewWaitUntilTerminated на ewNoWait
Цитата:
Код:[Run]
Filename: {app}\Prog1.exe; Flags: waituntilterminated skipifsilent
Filename: {app}\Prog2.exe; Flags: postinstall skipifsilent nowait
Filename: {app}\Prog3.exe; Flags: postinstall skipifsilent nowait
Помогите сделать так, если Prog2.exe или Prog3.exe не выбраны (postinstall) для запуска, то Prog1.exe чтобы тоже не выполнялся.
Цитата:
Мне бы еще сюда добавить, чтобы инсталлятор не дожидался остановки приложения (nowait).-- хм, а почему же ты приводил код с флагом waituntilterminated?
Ну если дожидаться окончания не надо, замени ewWaitUntilTerminated на ewNoWait
Genri
Цитата:
Да это просто пример, не совсем точный, просто чтобы была понятна суть, а сейчас у меня кое-что уже поменялось.
Спасибо, все работает как надо.
Цитата:
хм, а почему же ты приводил код с флагом waituntilterminated?
Да это просто пример, не совсем точный, просто чтобы была понятна суть, а сейчас у меня кое-что уже поменялось.
Спасибо, все работает как надо.
У меня несколько вопросов по поводу Corona Skin
1) Не нашел можно ли в нем сделать галочку для создания ярлыка программы (сам ярлык в скрипте Inno создан нужно сделать так чтобы пользователь имел возможность его не создавать)
2) как сделать checkbox запуск программы на последней странице инсталятора
3) раскомментироровал в примере который идет с Corona Skin (версия 5.4) следующий текст
#define AviOnProgress AddBackslash(SourcePath) + "Corona\Animation.avi"
и поместил туда соответствующий avi (который скачал по ссылке из комментария), но ни чего не изменилось
Добавлено:
Последний вопрос уже решил нужно просто было закомментировать
#define MiniProgress "100,100"
1) Не нашел можно ли в нем сделать галочку для создания ярлыка программы (сам ярлык в скрипте Inno создан нужно сделать так чтобы пользователь имел возможность его не создавать)
2) как сделать checkbox запуск программы на последней странице инсталятора
3) раскомментироровал в примере который идет с Corona Skin (версия 5.4) следующий текст
#define AviOnProgress AddBackslash(SourcePath) + "Corona\Animation.avi"
и поместил туда соответствующий avi (который скачал по ссылке из комментария), но ни чего не изменилось
Добавлено:
Последний вопрос уже решил нужно просто было закомментировать
#define MiniProgress "100,100"
Здравствуйте. Помогите пожалуйста разобраться с идентификацией страниц. Дело в том, что у меня есть 5 собственно созданных страниц, на первой моей странице пользователь выбирает какие компоненты он хотел бы установить и взависимости от выбранных компонентов в последствие создаются оставшиеся 4 страницы. Я бы хотел всем пяти страницам задать четкий идентификатор, чтобы при переходе на след. или предыдущую страницу CurPageID был всегда у страницы один и тотже, который я поставил им при создании.
Например:
Page1 := CreateCustomPage(100, 'Страница 1', 'Выбор компонентов');
Page1 := CreateCustomPage(101, 'Страница 1', 'Компонент 1');
Page1 := CreateCustomPage(102, 'Страница 2', 'Компонент 2');
Page1 := CreateCustomPage(103, 'Страница 3', 'Компонент 3');
Page1 := CreateCustomPage(104, 'Страница 4', 'Компонент 4');
Но уже при создании первой страницы выдается ошибка. Но если сделать так
Page1 := CreateCustomPage(wpWelcome, 'Страница 1', 'Выбор компонентов');
или так
Page1 := CreateCustomPage(1, 'Страница 1', 'Выбор компонентов');
То первая страница создается нормально.
Например:
Page1 := CreateCustomPage(100, 'Страница 1', 'Выбор компонентов');
Page1 := CreateCustomPage(101, 'Страница 1', 'Компонент 1');
Page1 := CreateCustomPage(102, 'Страница 2', 'Компонент 2');
Page1 := CreateCustomPage(103, 'Страница 3', 'Компонент 3');
Page1 := CreateCustomPage(104, 'Страница 4', 'Компонент 4');
Но уже при создании первой страницы выдается ошибка. Но если сделать так
Page1 := CreateCustomPage(wpWelcome, 'Страница 1', 'Выбор компонентов');
или так
Page1 := CreateCustomPage(1, 'Страница 1', 'Выбор компонентов');
То первая страница создается нормально.
mikutu
Цитата:
Эти вопросы решаются стандартно. Ярлыки можно привязать к странице задач, есть много примеров, где показывается, как создавать ярлыки на Рабочем столе, в меню Пуск и панели быстрого запуска.
После установки программа запускается с флагом postinstall (игнорируется, если инсталлятор предлагает перезагрузку)
tonegins
Сортируй страницы по идентификатору Page.ID, для каждой новой страницы он свой.
Цитата:
1) Не нашел, можно ли в Corona Skin сделать галочку для создания ярлыка программы (сам ярлык в скрипте Inno создан, нужно сделать так, чтобы пользователь имел возможность его не создавать)
2) как сделать checkbox - запуск программы на последней странице инсталятора.
Эти вопросы решаются стандартно. Ярлыки можно привязать к странице задач, есть много примеров, где показывается, как создавать ярлыки на Рабочем столе, в меню Пуск и панели быстрого запуска.
После установки программа запускается с флагом postinstall (игнорируется, если инсталлятор предлагает перезагрузку)
tonegins
Сортируй страницы по идентификатору Page.ID, для каждой новой страницы он свой.
tonegins
Цитата:
Page1 := CreateCustomPage(wpWelcome, 'Страница 1', 'Выбор компонентов');
Page2 := CreateCustomPage(Page1.ID, 'Страница 1', 'Компонент 1');
Page3 := CreateCustomPage(Page2.ID, 'Страница 2', 'Компонент 2');
Page4 := CreateCustomPage(Page3.ID, 'Страница 3', 'Компонент 3');
Page5 := CreateCustomPage(Page4.ID, 'Страница 4', 'Компонент 4');
хинт! Первый параметр задает после какой страницы будет вставлена создаваемая.
Цитата:
Я бы хотел всем пяти страницам задать четкий идентификатор-- так почему не задаешь? И что такое у тебя 100, 101, 102...?
Page1 := CreateCustomPage(wpWelcome, 'Страница 1', 'Выбор компонентов');
Page2 := CreateCustomPage(Page1.ID, 'Страница 1', 'Компонент 1');
Page3 := CreateCustomPage(Page2.ID, 'Страница 2', 'Компонент 2');
Page4 := CreateCustomPage(Page3.ID, 'Страница 3', 'Компонент 3');
Page5 := CreateCustomPage(Page4.ID, 'Страница 4', 'Компонент 4');
хинт! Первый параметр задает после какой страницы будет вставлена создаваемая.
Цитата:
Но если сделать так
Page1 := CreateCustomPage(wpWelcome, 'Страница 1', 'Выбор компонентов');
или так
Page1 := CreateCustomPage(1, 'Страница 1', 'Выбор компонентов');
То первая страница создается нормально.
Правильно, так и должно быть, здесь первый вариант правильный. Смотрим примеры из шапки и читаем хелп.
Genri
Цитата:
Сделал имеено так, теперь когда я жму на кнопку далее, в функции обработчике вывожу MsgBox(IntToStr(CurPageID), mbInformation, mb_Ok);
Первая страница с CurPageID = 1 - логично. Вторая уже с CurPageID = 100 - здесь я теряюсь, третья с CurPageID = 101, а теперь если я нажму на кнопку назад, то CurPageID = 102? В чем прикол? Ничего не разберу...
Цитата:
Page1 := CreateCustomPage(wpWelcome, 'Страница 1', 'Выбор компонентов');
Page2 := CreateCustomPage(Page1.ID, 'Страница 1', 'Компонент 1');
Page3 := CreateCustomPage(Page2.ID, 'Страница 2', 'Компонент 2');
Page4 := CreateCustomPage(Page3.ID, 'Страница 3', 'Компонент 3');
Page5 := CreateCustomPage(Page4.ID, 'Страница 4', 'Компонент 4');
Сделал имеено так, теперь когда я жму на кнопку далее, в функции обработчике вывожу MsgBox(IntToStr(CurPageID), mbInformation, mb_Ok);
Первая страница с CurPageID = 1 - логично. Вторая уже с CurPageID = 100 - здесь я теряюсь, третья с CurPageID = 101, а теперь если я нажму на кнопку назад, то CurPageID = 102? В чем прикол? Ничего не разберу...
Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
Предыдущая тема: Презентация
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.