Спасибо. Создал с помощью мастера проект посмотрел каких строк не хватает у меня в проекте добавил и проблема с иконками решена. С запуском тоже.
» Inno Setup (создание инсталяционных пакетов)
Genri
Цитата:
Если пользователь проставил все галочки, то есть он хочет установить все компоненты, то такая последовательность задания идентификаторов прокатит, а если он не выбрал какой то компонент, например 2, то страница Page2 не создасться, а когда пользователь дойдет до создания страницы 3, то выдастся ошибка, так как страницы 2 нет, и поэтому она не может быть предшедствующей, теперь должна стать предшедствующей 1-я страница.
Я создаю страницы в зависимости от условия. А можно ли как-нибудь реализовать мою задумку. А если создать все страницы сразу в одном месте без условий, а потом скрывать их взависимости от условия? Если можно скрыть страницу то как? Что-то типа Page2.Hide; ???
Цитата:
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');
Если пользователь проставил все галочки, то есть он хочет установить все компоненты, то такая последовательность задания идентификаторов прокатит, а если он не выбрал какой то компонент, например 2, то страница Page2 не создасться, а когда пользователь дойдет до создания страницы 3, то выдастся ошибка, так как страницы 2 нет, и поэтому она не может быть предшедствующей, теперь должна стать предшедствующей 1-я страница.
Я создаю страницы в зависимости от условия. А можно ли как-нибудь реализовать мою задумку. А если создать все страницы сразу в одном месте без условий, а потом скрывать их взависимости от условия? Если можно скрыть страницу то как? Что-то типа Page2.Hide; ???
tonegins
Цитата:
Не знаю, что ты хочешь обрабатывать, но вероятно, следует использовать CurPageChanged
procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.Caption:= IntToStr(CurPageID);
end;
Добавлено:
Цитата:
Цитата:
в функции обработчике вывожу MsgBox(IntToStr(CurPageID), mbInformation, mb_Ok);-- а позвольте спросить, в каком обработчике? Я так подозреваю, что используются NextButtonClick и BackButtonClick. А в хелпе указано, что в этих функциях CurPageID - это текущая страница, а если Result:= True, то отображается следующая\предыдущая. Т.е. если ты находишься на Page2 с ID например 102, то при нажатии Next, получишь в сообщении 102, но страница отобразиться следующая (103). Если теперь нажмешь назад, то естественно получишь 103, а страница отобразится 102. Надеюсь понятно объяснил.
Не знаю, что ты хочешь обрабатывать, но вероятно, следует использовать CurPageChanged
procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.Caption:= IntToStr(CurPageID);
end;
Добавлено:
Цитата:
Я создаю страницы в зависимости от условия.-- не совсем правильный подход. В подавляющем большинстве случаев, страницы следует создавать всегда. А для проверки, отображать страницу или пропускать, исползовать функцию ShouldSkipPage
Genri
Большое спасибо за ответы, буду пробовать.
Добавлено:
Genri
Не подскажите как скопировать папку в директорию, которую выбрал пользователь, на созданной мной странице? Я не хочу использовать
Source: "D:\InstallFile\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Хочу реализовать это программно. Не подскажите в каком направление копать?
В принципе хотелось бы использовать минимум стандартных страниц
Большое спасибо за ответы, буду пробовать.
Добавлено:
Genri
Не подскажите как скопировать папку в директорию, которую выбрал пользователь, на созданной мной странице? Я не хочу использовать
Source: "D:\InstallFile\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Хочу реализовать это программно. Не подскажите в каком направление копать?
В принципе хотелось бы использовать минимум стандартных страниц
tonegins
Цитата:
ЗЫ. Хотя я сторонник максимального использования штатных средств
Добавлено:
И все-таки, если не секрет, почему нельзя использовать штатные средства? Если проблема в том, что файлы должны копироваться в зависимости от условий, то есть такой параметр как Check. Так же можно использовать параметры BeforeInstall и AfterInstall. Т.е. многое проще реализовывать штатными средствами.
Цитата:
как скопировать папку в директорию-- либо смотри в хелпе описание функции FindFirst (там же есть и пример использования, но без вложенных папок). Либо поищи в теме файл SHFileOperation.iss - в нем я прописывал функцию CopyDir, которая, насколько помню, копирует с вложенными.
...............
Хочу реализовать это программно
ЗЫ. Хотя я сторонник максимального использования штатных средств
Добавлено:
И все-таки, если не секрет, почему нельзя использовать штатные средства? Если проблема в том, что файлы должны копироваться в зависимости от условий, то есть такой параметр как Check. Так же можно использовать параметры BeforeInstall и AfterInstall. Т.е. многое проще реализовывать штатными средствами.
Genri
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = wpSelectDir) or (PageID = wpReady) or (PageID = wpInstalling) then
Result:= True;
end;
первые два PageID = wpSelectDir и PageID = wpReady работают - страница не отображается, но PageID = wpInstalling не выполняется, то есть страница отображается и установка продолжается. Как-нибудь можно отменить установку, скажем перейти сразу на финишную страницу?? Заранее спасибо!
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = wpSelectDir) or (PageID = wpReady) or (PageID = wpInstalling) then
Result:= True;
end;
первые два PageID = wpSelectDir и PageID = wpReady работают - страница не отображается, но PageID = wpInstalling не выполняется, то есть страница отображается и установка продолжается. Как-нибудь можно отменить установку, скажем перейти сразу на финишную страницу?? Заранее спасибо!
tonegins
Цитата:
Сложно давать советы, когда непонятно что требуется в результате.
А ShouldSkipPage не вызывается для wpWelcome, wpPreparing и wpInstalling (см.хелп)
Цитата:
Как-нибудь можно отменить установку, скажем перейти сразу на финишную страницу?-- так отменить или продолжить? Какой-то странный у тебя инсталлятор получается Может тебе надо продолжить выполнение инсталлятора, но никаких файлов не копировать? Ну так не копируй. Копируй только если выполнено условие.
Сложно давать советы, когда непонятно что требуется в результате.
А ShouldSkipPage не вызывается для wpWelcome, wpPreparing и wpInstalling (см.хелп)
Есть пару вопросов, а точнее два.
1.Я уже спрашивал, но на тот момент никто не смог помочь, а именно по вопросу – в Inno есть стандартное сообщение появляющееся, когда не удалось удалить файлы потому, что они были заняты другим приложением. Я добавляю в свой скрипт код именно этого сообщения (искусственно), когда в папке остались файлы, которые не были прописаны в аннинстале на удаление, то-есть созданные или добавленные пользователям.
Так вот когда получается так, когда появляется стандартное сообщение, то получается, что с моим их появляется два.
Как можно отключить стандартное сообщение (Деинсталляция My program завершена. Часть элементов не удалось удалить. Вы можете удалить их самостоятельно.
2. Как можно добавить небольшой рисунок (.bmp, .jpg или т.п.) на страницу, к примеру [Tasks], во многих инсталляторах программ это реализовано, но по предыдущему форуму найти это мне не удалось.
Если знаете как, то отпишитесь.
1.Я уже спрашивал, но на тот момент никто не смог помочь, а именно по вопросу – в Inno есть стандартное сообщение появляющееся, когда не удалось удалить файлы потому, что они были заняты другим приложением. Я добавляю в свой скрипт код именно этого сообщения (искусственно), когда в папке остались файлы, которые не были прописаны в аннинстале на удаление, то-есть созданные или добавленные пользователям.
Так вот когда получается так, когда появляется стандартное сообщение, то получается, что с моим их появляется два.
Как можно отключить стандартное сообщение (Деинсталляция My program завершена. Часть элементов не удалось удалить. Вы можете удалить их самостоятельно.
2. Как можно добавить небольшой рисунок (.bmp, .jpg или т.п.) на страницу, к примеру [Tasks], во многих инсталляторах программ это реализовано, но по предыдущему форуму найти это мне не удалось.
Если знаете как, то отпишитесь.
Genri
Цитата:
О! Это мне и надо! Можно кусок кода как не копировать или копировать если есть условие? Извиняюсь за навязчивость конечно, но увы я только первый день работаю с Inno...
Цитата:
Может тебе надо продолжить выполнение инсталлятора, но никаких файлов не копировать? Ну так не копируй. Копируй только если выполнено условие.
О! Это мне и надо! Можно кусок кода как не копировать или копировать если есть условие? Извиняюсь за навязчивость конечно, но увы я только первый день работаю с Inno...
tonegins -- первый день желательно потратить на изучение хелпа
Код: [no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[Files]
Source: "MyProg.exe"; DestDir: "{app}"; Check: MyProgCheck
Source: "MyProg.chm"; DestDir: "{app}"
Source: "Readme.txt"; DestDir: "{app}"
[Code]
function MyProgCheck(): Boolean;
begin
Result := FileExists(ExpandConstant('{src}\new.txt'));
end; [/no]
Код: [no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[Files]
Source: "MyProg.exe"; DestDir: "{app}"; Check: MyProgCheck
Source: "MyProg.chm"; DestDir: "{app}"
Source: "Readme.txt"; DestDir: "{app}"
[Code]
function MyProgCheck(): Boolean;
begin
Result := FileExists(ExpandConstant('{src}\new.txt'));
end; [/no]
Genri
Цитата:
Цитата:
Но все равно спасибо, теперь хоть знаю что его не отключить.
Подскажите по второму вопросу насчет вставки изобоажения, где можно найти решение (если это конечно обсуждалось).
Цитата:
И кстати, это сообщение не появляется, если в папке с программой есть файлы созданные пользователем., в этом случае появляется мое сообщение.
Цитата:
Сообщение появляется если деинсталлятор не смог удалить файлы созданные инсталлятором., а здесь в месте с моим их получается два, поэтому и хотел отключить.
Но все равно спасибо, теперь хоть знаю что его не отключить.
Подскажите по второму вопросу насчет вставки изобоажения, где можно найти решение (если это конечно обсуждалось).
Diawer
Цитата:
Цитата:
Цитата:
теперь хоть знаю что его не отключить.-- Неверный вывод Я сказал, что не знаю как, но почти уверен что можно.
Цитата:
...а здесь в месте с моим их получается два-- хм, тогда выходит что в этом случае лишним является твое. Можно попробовать определить "лишние" файлы в начале запуска деинсталлятора и там же вывести предупреждение пользователю.
Genri
По Вашему примеру я сделал так чтоб файлы копировались взависимости от условия
В секции Files у меня тока один source
[Files]
Source : "D:\Installation\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: MyProgCheck
так вот, если выполнилось условие в MyProgCheck и файлы копировать не надо, то и страницу wpInstalling мне показывать не надо. Как от нее избавиться и перейти на следующую?
Еще вопрос. Если пользователь не выбрал один из компонентов, то есть копирование файлов не требуется. Как запретить стандартную установку, то есть без создания каталога, деинсталяция мне вообще не требуется. Но при этом продолжить выполнение созданных мной страниц.
Дело в том, что мои страницы это подключение к Oracle, создание схем и вкачивание дампов. И вызов двух других сторонних инсталяторов. Поэтому если не требуется копировать файлы, мне не нужно, чтобы инсталятор создавал какие-либо папки, а тем более деинсталятор.
По Вашему примеру я сделал так чтоб файлы копировались взависимости от условия
В секции Files у меня тока один source
[Files]
Source : "D:\Installation\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: MyProgCheck
так вот, если выполнилось условие в MyProgCheck и файлы копировать не надо, то и страницу wpInstalling мне показывать не надо. Как от нее избавиться и перейти на следующую?
Еще вопрос. Если пользователь не выбрал один из компонентов, то есть копирование файлов не требуется. Как запретить стандартную установку, то есть без создания каталога, деинсталяция мне вообще не требуется. Но при этом продолжить выполнение созданных мной страниц.
Дело в том, что мои страницы это подключение к Oracle, создание схем и вкачивание дампов. И вызов двух других сторонних инсталяторов. Поэтому если не требуется копировать файлы, мне не нужно, чтобы инсталятор создавал какие-либо папки, а тем более деинсталятор.
tonegins
Цитата:
Цитата:
Может конечно речь идет о том, что вызываются сторонние программы со своими страницами и окно инсталлятора надо скрыть, но это тоже в хелпе не далеко запрятано.
Цитата:
без создания каталога, деинсталяция мне вообще не требуется-- ты все-таки для разнообразия почитай хелп (в т.ч. и описание директив секции [Setup]).
Цитата:
если выполнилось условие в MyProgCheck и файлы копировать не надо, то и страницу wpInstalling мне показывать не надо.-- уверен? Тут варианта два: либо какие-то действия все-таки выполняются - и показывать надо; либо неверный алгоритм инсталлятора - и надо переделать. Ведь ситуация, когда при продолжении инсталляции ничего не выполняется, заведомо неправильная. Т.е. либо что-то делаем, либо отменяем. Не следует вводить пользователя в заблуждение - типа:- "У меня есть посылка для вас, только я ее вам не отдам" (C)
Может конечно речь идет о том, что вызываются сторонние программы со своими страницами и окно инсталлятора надо скрыть, но это тоже в хелпе не далеко запрятано.
Товарищи, ещё четыре месяца назад я сделал русификатор для Inno Setup v.5.2.3 и как-то про него забыл. Русификация выполнена на 90%. Притом русификатор "безболезненно" устанавливается на Inno Setup QuickStartPack v.5.2.3. Если кому-нибудь нужно моё творение, скачать его можно здесь. Заранее извиняюсь, что залил файлы на letitbit.net, просто друго подходящего файлообменника (без заморочек и ограничений), я не знаю. В архиве Вы найдёте две версии русификатора, одна выполнена в виде патча, а другая, представляет собой собственно русифицированный файл, который нужно скопировать с заменой в корневой каталог Inno Setup v.5.2.3.
Artem_Butenko
Цитата:
Цитата:
друго подходящего файлообменника (без заморочек и ограничений), я не знаю.-- http://forum.ru-board.com/topic.cgi?forum=35&bm=1&topic=9952#1
Genri
Подскажите пожалуйста, можно ли "прикреплять" файлы небольшого объёма непосредственно на форуме? Если да, то как?
Подскажите пожалуйста, можно ли "прикреплять" файлы небольшого объёма непосредственно на форуме? Если да, то как?
Здравствуйте, у меня вопрос, на который не смог найти ответа:
Как сделать так, чтобы при запуске инсталлятора, производилась автоматическая деинсталляция предыдущей версии приложения.
Как сделать так, чтобы при запуске инсталлятора, производилась автоматическая деинсталляция предыдущей версии приложения.
Artem_Butenko -- как, можешь посмотреть здесь. А можно или нельзя - это к модераторам.
Serega0675 -- если мне память не изменяет - несколько страниц назад был пример.
Serega0675 -- если мне память не изменяет - несколько страниц назад был пример.
Выкладываю DLL-ку для работы со службами.
Функции:
ServiceStart(aMachine, aServiceName : string): boolean - запуск службы;
ServiceStop(aMachine,aServiceName : string): boolean - остановка службы;
ServicePause(aMachine,aServiceName : string): boolean - приостановка работы службы;
ServiceContinue(aMachine,aServiceName : string): boolean - возобновление работы службы;
ServiceGetStatus(sMachine, sService: PChar): DWORD - возвращает состояние службы ("работает", "остановлена", "пауза" и т.д.).
Скачать DLL можно здесь или здесь.
А здесь можно почитать про практическое применение и более подробное описание.
Функции:
ServiceStart(aMachine, aServiceName : string): boolean - запуск службы;
ServiceStop(aMachine,aServiceName : string): boolean - остановка службы;
ServicePause(aMachine,aServiceName : string): boolean - приостановка работы службы;
ServiceContinue(aMachine,aServiceName : string): boolean - возобновление работы службы;
ServiceGetStatus(sMachine, sService: PChar): DWORD - возвращает состояние службы ("работает", "остановлена", "пауза" и т.д.).
Скачать DLL можно здесь или здесь.
А здесь можно почитать про практическое применение и более подробное описание.
Genri
Спасибо, нашёл на 51 странице
сообщение Diawer:
______________________________________________________________________________________________________
Помогите совместить два кода [more=(1)][Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=My Program
UninstallDisplayName=My Program
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[_Code]
var
ResultCode: Integer;
ResultStr: string;
function InitializeSetup(): Boolean;
begin
Result := True;
begin
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'DisplayName', ResultStr) then //брать из AppName
begin
If ResultStr='My Program 1.0' then //брать из UninstallDisplayName
begin
ResultStr:=RemoveQuotes(ResultStr);
if MsgBox('Setup has detected that ' + ResultStr + ' is already installed on your computer.'#13#13'You would like to remove all before continuing?', mbInformation, MB_OKCANCEL) = idCANCEL then
begin
Result := False;
end else
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'UninstallString', ResultStr) then
begin
If ResultStr <> '' then
begin
ResultStr := RemoveQuotes(ResultStr);
if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then
MsgBox('Uninstall Error. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Probably, uninstall files was moved, removed or renamed.', mbError, MB_OK);
end;
end;
end;
end;
end;
end; [/more] - инсталлятор определяет, что программа уже установленна, сообщение на подтверждение и запуск деинсталлятора,
[more=(2)][Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=My Program
UninstallDisplayName=My Program
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Files]
Source: ISTask.dll; DestDir: {app}
Source: ISTask.dll; DestDir: {tmp}; Flags: dontcopy
[_Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload setuponly';
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload setuponly';
function KillTaskA(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';
function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';
function InitializeSetup(): Boolean;
begin
If RunTask('My Program.exe', false) then
begin
if MsgBox('Программа установки обнаружила, что программа PowerOff запущена в данный момент.'#13#13'Закрыть программу и продолжить удаление?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('My Program.exe');
Result := True;
end else
Exit;
end;
Result := True;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
UnloadDLL(ExpandConstant('{app}\ISTask.dll'));
end;
end;
function InitializeUninstall(): Boolean;
begin
If RunTaskA('My Program.exe', false) then
begin
if MsgBox('Программа удаления обнаружила, что программа PowerOff запущена в данный момент.'#13#13'Закрыть программу и продолжить удаление?', mbInformation, mb_YesNo) = idYes then
begin
KillTaskA('My Program.exe');
Result := True;
end else
Exit;
end;
Result := True;
end; [/more] - инсталлятор определяет, что программа запущена и предлагает выгрузить (закрыть) процесс, перед установкой и перед удалением. Когда деинсталлятор запускаешь через ярлык код (1) не участвует (всё нормально), а вот когда повторную установку при запущенной программе, то надо, что бы сначала срабатывал (1)код -нажимаем "Да", срабатывает код (2), ну а там уже появляется стандартное сообщение инстала "Вы действительно хотите удалить %1 и все компоненты программы?" (его впринципе можно убрать)
______________________________________________________________________________________________________
Так у меня возник вопрос:
Можно ли объединить эти две проверки в один код, но чтобы выгрузка работающего процесса происходила автоматически, т.е. не выдавала запросов на закрытие, а сама его закрывала?
Спасибо, нашёл на 51 странице
сообщение Diawer:
______________________________________________________________________________________________________
Помогите совместить два кода [more=(1)][Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=My Program
UninstallDisplayName=My Program
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[_Code]
var
ResultCode: Integer;
ResultStr: string;
function InitializeSetup(): Boolean;
begin
Result := True;
begin
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'DisplayName', ResultStr) then //брать из AppName
begin
If ResultStr='My Program 1.0' then //брать из UninstallDisplayName
begin
ResultStr:=RemoveQuotes(ResultStr);
if MsgBox('Setup has detected that ' + ResultStr + ' is already installed on your computer.'#13#13'You would like to remove all before continuing?', mbInformation, MB_OKCANCEL) = idCANCEL then
begin
Result := False;
end else
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'UninstallString', ResultStr) then
begin
If ResultStr <> '' then
begin
ResultStr := RemoveQuotes(ResultStr);
if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then
MsgBox('Uninstall Error. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Probably, uninstall files was moved, removed or renamed.', mbError, MB_OK);
end;
end;
end;
end;
end;
end; [/more] - инсталлятор определяет, что программа уже установленна, сообщение на подтверждение и запуск деинсталлятора,
[more=(2)][Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=My Program
UninstallDisplayName=My Program
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Files]
Source: ISTask.dll; DestDir: {app}
Source: ISTask.dll; DestDir: {tmp}; Flags: dontcopy
[_Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload setuponly';
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload setuponly';
function KillTaskA(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';
function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';
function InitializeSetup(): Boolean;
begin
If RunTask('My Program.exe', false) then
begin
if MsgBox('Программа установки обнаружила, что программа PowerOff запущена в данный момент.'#13#13'Закрыть программу и продолжить удаление?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('My Program.exe');
Result := True;
end else
Exit;
end;
Result := True;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
UnloadDLL(ExpandConstant('{app}\ISTask.dll'));
end;
end;
function InitializeUninstall(): Boolean;
begin
If RunTaskA('My Program.exe', false) then
begin
if MsgBox('Программа удаления обнаружила, что программа PowerOff запущена в данный момент.'#13#13'Закрыть программу и продолжить удаление?', mbInformation, mb_YesNo) = idYes then
begin
KillTaskA('My Program.exe');
Result := True;
end else
Exit;
end;
Result := True;
end; [/more] - инсталлятор определяет, что программа запущена и предлагает выгрузить (закрыть) процесс, перед установкой и перед удалением. Когда деинсталлятор запускаешь через ярлык код (1) не участвует (всё нормально), а вот когда повторную установку при запущенной программе, то надо, что бы сначала срабатывал (1)код -нажимаем "Да", срабатывает код (2), ну а там уже появляется стандартное сообщение инстала "Вы действительно хотите удалить %1 и все компоненты программы?" (его впринципе можно убрать)
______________________________________________________________________________________________________
Так у меня возник вопрос:
Можно ли объединить эти две проверки в один код, но чтобы выгрузка работающего процесса происходила автоматически, т.е. не выдавала запросов на закрытие, а сама его закрывала?
http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=715&limit=1&m=1#1
Обнаружил проблему. При добавлении 288 строки вылетает ошибка "runtime error (at 62:158)". Что мне делать?
Обнаружил проблему. При добавлении 288 строки вылетает ошибка "runtime error (at 62:158)". Что мне делать?
Serega0675
Цитата:
[more=Так можно]
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
OutputBaseFilename=My Program
UninstallDisplayName=My Program 1.0
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl";
[Files]
Source: "ISTask.dll"; Flags: dontcopy;
[Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload setuponly';
var
ResultCode: Integer;
ResultStr: String;
function InitializeSetup(): Boolean;
begin
KillTask('notepad.exe');
Result := True;
begin
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'DisplayName', ResultStr) then
begin
If ResultStr='My Program 1.0' then
begin
ResultStr:=RemoveQuotes(ResultStr);
if MsgBox('Setup has detected that ' + ResultStr + ' is already installed on your computer.'#13#13'You would like to remove all before continuing?', mbInformation, MB_OKCANCEL) = idCANCEL then
begin
Result := False;
end else
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'UninstallString', ResultStr) then
begin
If ResultStr <> '' then
begin
ResultStr := RemoveQuotes(ResultStr);
if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then
MsgBox('Uninstall Error. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Probably, uninstall files was moved, removed or renamed.', mbError, MB_OK);
end;
end;
end;
end;
end;
end;
[/more] ... на примере закрытия блокнота, если открыт, - автоматически
Просто убить процесс можно без "ISTask.dll" - [more=так]
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
OutputBaseFilename=My Program
UninstallDisplayName=My Program 1.0
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl";
[Code]
var
ErrorCode, ResultCode: Integer;
ResultStr: String;
function InitializeSetup(): Boolean;
begin
Exec('taskkill', '/f /im notepad.exe', '', SW_HIDE,ewWaitUntilTerminated, ErrorCode);
Result := True;
begin
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'DisplayName', ResultStr) then
begin
If ResultStr='My Program 1.0' then
begin
ResultStr:=RemoveQuotes(ResultStr);
if MsgBox('Setup has detected that ' + ResultStr + ' is already installed on your computer.'#13#13'You would like to remove all before continuing?', mbInformation, MB_OKCANCEL) = idCANCEL then
begin
Result := False;
end else
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'UninstallString', ResultStr) then
begin
If ResultStr <> '' then
begin
ResultStr := RemoveQuotes(ResultStr);
if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then
MsgBox('Uninstall Error. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Probably, uninstall files was moved, removed or renamed.', mbError, MB_OK);
end;
end;
end;
end;
end;
end;
[/more]
Цитата:
Можно ли объединить эти две проверки в один код, но чтобы выгрузка работающего процесса происходила автоматически
[more=Так можно]
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
OutputBaseFilename=My Program
UninstallDisplayName=My Program 1.0
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl";
[Files]
Source: "ISTask.dll"; Flags: dontcopy;
[Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload setuponly';
var
ResultCode: Integer;
ResultStr: String;
function InitializeSetup(): Boolean;
begin
KillTask('notepad.exe');
Result := True;
begin
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'DisplayName', ResultStr) then
begin
If ResultStr='My Program 1.0' then
begin
ResultStr:=RemoveQuotes(ResultStr);
if MsgBox('Setup has detected that ' + ResultStr + ' is already installed on your computer.'#13#13'You would like to remove all before continuing?', mbInformation, MB_OKCANCEL) = idCANCEL then
begin
Result := False;
end else
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'UninstallString', ResultStr) then
begin
If ResultStr <> '' then
begin
ResultStr := RemoveQuotes(ResultStr);
if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then
MsgBox('Uninstall Error. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Probably, uninstall files was moved, removed or renamed.', mbError, MB_OK);
end;
end;
end;
end;
end;
end;
[/more] ... на примере закрытия блокнота, если открыт, - автоматически
Просто убить процесс можно без "ISTask.dll" - [more=так]
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
OutputBaseFilename=My Program
UninstallDisplayName=My Program 1.0
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl";
[Code]
var
ErrorCode, ResultCode: Integer;
ResultStr: String;
function InitializeSetup(): Boolean;
begin
Exec('taskkill', '/f /im notepad.exe', '', SW_HIDE,ewWaitUntilTerminated, ErrorCode);
Result := True;
begin
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'DisplayName', ResultStr) then
begin
If ResultStr='My Program 1.0' then
begin
ResultStr:=RemoveQuotes(ResultStr);
if MsgBox('Setup has detected that ' + ResultStr + ' is already installed on your computer.'#13#13'You would like to remove all before continuing?', mbInformation, MB_OKCANCEL) = idCANCEL then
begin
Result := False;
end else
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'UninstallString', ResultStr) then
begin
If ResultStr <> '' then
begin
ResultStr := RemoveQuotes(ResultStr);
if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then
MsgBox('Uninstall Error. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Probably, uninstall files was moved, removed or renamed.', mbError, MB_OK);
end;
end;
end;
end;
end;
end;
[/more]
Victor_Dobrov
http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=715&limit=1&m=1#1 [?]
Обнаружил проблему. При добавлении 288 строки вылетает ошибка "runtime error (at 62:158)". Что мне делать?
p.s. Как продвигаются дела с интерфейсом выбора компонентов, как у NSIS?
http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=715&limit=1&m=1#1 [?]
Обнаружил проблему. При добавлении 288 строки вылетает ошибка "runtime error (at 62:158)". Что мне делать?
p.s. Как продвигаются дела с интерфейсом выбора компонентов, как у NSIS?
Как в этом [more=Коде][Setup]
AppName=MyProg
AppVerName=MyProg 1.51
DefaultDirName={pf}\MyProg
DefaultGroupName=MyProg
[Languages]
Name: english; MessagesFile: compiler:Default.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Tasks]
Name: english; Description: Английский; GroupDescription: Выберите какой язык установить для MyProg:; Flags: exclusive
Name: russian; Description: Русский; GroupDescription: Выберите какой язык установить для MyProg:; Flags: exclusive
[Files]
Source: MyProgENG.exe; DestDir: {app}; DestName: MyProg.exe; Languages: english
Source: MyProgRUS.exe; DestDir: {app}; DestName: MyProg.exe; Languages: russian
[/more] перенести из секции [Tasks] на страницу "Выбора папки установки".
AppName=MyProg
AppVerName=MyProg 1.51
DefaultDirName={pf}\MyProg
DefaultGroupName=MyProg
[Languages]
Name: english; MessagesFile: compiler:Default.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Tasks]
Name: english; Description: Английский; GroupDescription: Выберите какой язык установить для MyProg:; Flags: exclusive
Name: russian; Description: Русский; GroupDescription: Выберите какой язык установить для MyProg:; Flags: exclusive
[Files]
Source: MyProgENG.exe; DestDir: {app}; DestName: MyProg.exe; Languages: english
Source: MyProgRUS.exe; DestDir: {app}; DestName: MyProg.exe; Languages: russian
[/more] перенести из секции [Tasks] на страницу "Выбора папки установки".
serg_aka_lain
СПАСИБО ОГРОМНОЕ!!! То, что надо.
СПАСИБО ОГРОМНОЕ!!! То, что надо.
Diawer
[more=Как такой вариант]
[Setup]
AppName=MyProg
AppVerName=MyProg 1.0
DefaultDirName={pf}\MyProg
OutputDir=.
[Files]
Source: MyProgENG.exe; DestDir: {app}; DestName: MyProg.exe; Check: english;
Source: MyProgRUS.exe; DestDir: {app}; DestName: MyProg.exe; Check: russian;
[Code]
var
RadioButton1, RadioButton2: TNewRadioButton;
function russian: Boolean;
begin
Result := RadioButton1.Checked;
end;
function english: Boolean;
begin
Result := RadioButton2.Checked;
end;
procedure InitializeWizard();
var
MsgStr: TNewStaticText;
begin
MsgStr := TNewStaticText.Create(WizardForm);
with MsgStr do
begin
Top := ScaleY(130);
Left := ScaleX(3);
Width := ScaleX(400);
AutoSize := False;
Caption := 'Выберите какой язык установить для MyProg:';
Parent := WizardForm.SelectDirPage;
end;
RadioButton1 := TNewRadioButton.Create(WizardForm);
with RadioButton1 do
begin
Top := ScaleY(150);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Русский';
Checked := True;
Parent := WizardForm.SelectDirPage;
end;
RadioButton2 := TNewRadioButton.Create(WizardForm);
with RadioButton2 do
begin
Top := ScaleY(170);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Английский';
Parent := WizardForm.SelectDirPage;
end;
end;
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
var
S: String;
begin
S := S + MemoDirInfo + NewLine + NewLine;
S := S + 'Выберите какой язык установить для MyProg:' + NewLine;
if RadioButton1.Checked then
begin
S := S + Space + 'Русский' + NewLine;
end else
begin
S := S + Space + 'Английский' + NewLine;
end;
S := S + NewLine + NewLine;
Result := S;
end;
[/more]
[more=Как такой вариант]
[Setup]
AppName=MyProg
AppVerName=MyProg 1.0
DefaultDirName={pf}\MyProg
OutputDir=.
[Files]
Source: MyProgENG.exe; DestDir: {app}; DestName: MyProg.exe; Check: english;
Source: MyProgRUS.exe; DestDir: {app}; DestName: MyProg.exe; Check: russian;
[Code]
var
RadioButton1, RadioButton2: TNewRadioButton;
function russian: Boolean;
begin
Result := RadioButton1.Checked;
end;
function english: Boolean;
begin
Result := RadioButton2.Checked;
end;
procedure InitializeWizard();
var
MsgStr: TNewStaticText;
begin
MsgStr := TNewStaticText.Create(WizardForm);
with MsgStr do
begin
Top := ScaleY(130);
Left := ScaleX(3);
Width := ScaleX(400);
AutoSize := False;
Caption := 'Выберите какой язык установить для MyProg:';
Parent := WizardForm.SelectDirPage;
end;
RadioButton1 := TNewRadioButton.Create(WizardForm);
with RadioButton1 do
begin
Top := ScaleY(150);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Русский';
Checked := True;
Parent := WizardForm.SelectDirPage;
end;
RadioButton2 := TNewRadioButton.Create(WizardForm);
with RadioButton2 do
begin
Top := ScaleY(170);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Английский';
Parent := WizardForm.SelectDirPage;
end;
end;
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
var
S: String;
begin
S := S + MemoDirInfo + NewLine + NewLine;
S := S + 'Выберите какой язык установить для MyProg:' + NewLine;
if RadioButton1.Checked then
begin
S := S + Space + 'Русский' + NewLine;
end else
begin
S := S + Space + 'Английский' + NewLine;
end;
S := S + NewLine + NewLine;
Result := S;
end;
[/more]
serg_aka_lain, это то, что надо, вот только суть в том, что при первом выборе языка (в самом начале) меняется язык для самого инсталлятора, а с помощью этого кода происходит копирование файлов в зависимости от того какой язык выбран, то есть если я сначала (для инсталлятора) выбираю русский, а затем в твоем коде английский, то копируется русский файл. В коде, который ты дал копирование происходит в зависимости от языка выбранного в начале (то есть для инсталлятора).
Diawer
Цитата:
-Используй функцию "ActiveLanguage" [more=Примерно так]
[Setup]
AppName=MyProg
AppVerName=MyProg 1.0
DefaultDirName={pf}\MyProg
OutputDir=.
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl";
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl";
[Files]
Source: MyProgENG.exe; DestDir: {app}; DestName: MyProg.exe; Check: english;
Source: MyProgRUS.exe; DestDir: {app}; DestName: MyProg.exe; Check: russian;
[Code]
var
RadioButton1, RadioButton2: TNewRadioButton;
function russian: Boolean;
begin
Result := RadioButton1.Checked;
end;
function english: Boolean;
begin
Result := RadioButton2.Checked;
end;
procedure InitializeWizard();
var
MsgStr: TNewStaticText;
begin
MsgStr := TNewStaticText.Create(WizardForm);
with MsgStr do
begin
Top := ScaleY(130);
Left := ScaleX(3);
Width := ScaleX(400);
AutoSize := False;
Caption := 'Выберите какой язык установить для MyProg:';
Parent := WizardForm.SelectDirPage;
end;
RadioButton1 := TNewRadioButton.Create(WizardForm);
with RadioButton1 do
begin
Top := ScaleY(150);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Русский';
if ActiveLanguage = 'russian' then
begin
Checked := True;
end;
Parent := WizardForm.SelectDirPage;
end;
RadioButton2 := TNewRadioButton.Create(WizardForm);
with RadioButton2 do
begin
Top := ScaleY(170);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Английский';
if ActiveLanguage = 'english' then
begin
Checked := True;
end;
Parent := WizardForm.SelectDirPage;
end;
end;
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
var
S: String;
begin
S := S + MemoDirInfo + NewLine + NewLine;
S := S + 'Выберите какой язык установить для MyProg:' + NewLine;
if RadioButton1.Checked then
begin
S := S + Space + 'Русский' + NewLine;
end else
begin
S := S + Space + 'Английский' + NewLine;
end;
S := S + NewLine + NewLine;
Result := S;
end;
[/more]
Цитата:
происходит копирование файлов в зависимости от того какой язык выбран
-Используй функцию "ActiveLanguage" [more=Примерно так]
[Setup]
AppName=MyProg
AppVerName=MyProg 1.0
DefaultDirName={pf}\MyProg
OutputDir=.
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl";
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl";
[Files]
Source: MyProgENG.exe; DestDir: {app}; DestName: MyProg.exe; Check: english;
Source: MyProgRUS.exe; DestDir: {app}; DestName: MyProg.exe; Check: russian;
[Code]
var
RadioButton1, RadioButton2: TNewRadioButton;
function russian: Boolean;
begin
Result := RadioButton1.Checked;
end;
function english: Boolean;
begin
Result := RadioButton2.Checked;
end;
procedure InitializeWizard();
var
MsgStr: TNewStaticText;
begin
MsgStr := TNewStaticText.Create(WizardForm);
with MsgStr do
begin
Top := ScaleY(130);
Left := ScaleX(3);
Width := ScaleX(400);
AutoSize := False;
Caption := 'Выберите какой язык установить для MyProg:';
Parent := WizardForm.SelectDirPage;
end;
RadioButton1 := TNewRadioButton.Create(WizardForm);
with RadioButton1 do
begin
Top := ScaleY(150);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Русский';
if ActiveLanguage = 'russian' then
begin
Checked := True;
end;
Parent := WizardForm.SelectDirPage;
end;
RadioButton2 := TNewRadioButton.Create(WizardForm);
with RadioButton2 do
begin
Top := ScaleY(170);
Left := ScaleX(10);
Width := ScaleX(300);
Caption := 'Английский';
if ActiveLanguage = 'english' then
begin
Checked := True;
end;
Parent := WizardForm.SelectDirPage;
end;
end;
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
var
S: String;
begin
S := S + MemoDirInfo + NewLine + NewLine;
S := S + 'Выберите какой язык установить для MyProg:' + NewLine;
if RadioButton1.Checked then
begin
S := S + Space + 'Русский' + NewLine;
end else
begin
S := S + Space + 'Английский' + NewLine;
end;
S := S + NewLine + NewLine;
Result := S;
end;
[/more]
YurCompMan2
Цитата:
Вопрос неясен. В этом скрипте всего 144 строки.
Цитата:
Если речь о том, чтобы сымитировать NSIS один в один, то мне это не интересно. А вот этот скрипт вскоре доработаю.
Цитата:
http://forum.ru-board.com/topic.cgi?forum=5&topic=27438&start=715&limit=1&m=1#1
Обнаружил проблему. При добавлении 288 строки вылетает ошибка "runtime error (at 62:158)". Что мне делать?
Вопрос неясен. В этом скрипте всего 144 строки.
Цитата:
Как продвигаются дела с интерфейсом выбора компонентов, как у NSIS?
Если речь о том, чтобы сымитировать NSIS один в один, то мне это не интересно. А вот этот скрипт вскоре доработаю.
Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
Предыдущая тема: Презентация
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.