Кто может помоч с записью в лог-файл?.. Вопрос описан выше.
» Inno Setup (создание инсталяционных пакетов)
nOobCrafter -- [more][no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program
[Files]
Source: MyProg.exe; DestDir: {app}
[Code]
var
str: string;
function InitializeSetup: Boolean;
begin
str:= #13#10 + '=================' + #13#10 +
'Установка начата : ' + GetDateTimeString('dd/mm/yyyy hh:nn:ss', '-', ':');
str:= str + #13#10 + 'Версия : ' + '{#SetupSetting("AppVerName")}';
str:= str + #13#10 + 'Компьютер/Пользователь : ' +
GetComputerNameString + '/' + GetUserNameString;
SaveStringToFile('C:\Windows\log.txt', str, True);
Result:= True;
end;
procedure DeinitializeSetup();
begin
str:= #13#10 + 'Установка закончена : ' +
GetDateTimeString('dd/mm/yyyy hh:nn:ss', '-', ':');
SaveStringToFile('C:\Windows\log.txt', str, True);
end; [/no][/more]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program
[Files]
Source: MyProg.exe; DestDir: {app}
[Code]
var
str: string;
function InitializeSetup: Boolean;
begin
str:= #13#10 + '=================' + #13#10 +
'Установка начата : ' + GetDateTimeString('dd/mm/yyyy hh:nn:ss', '-', ':');
str:= str + #13#10 + 'Версия : ' + '{#SetupSetting("AppVerName")}';
str:= str + #13#10 + 'Компьютер/Пользователь : ' +
GetComputerNameString + '/' + GetUserNameString;
SaveStringToFile('C:\Windows\log.txt', str, True);
Result:= True;
end;
procedure DeinitializeSetup();
begin
str:= #13#10 + 'Установка закончена : ' +
GetDateTimeString('dd/mm/yyyy hh:nn:ss', '-', ':');
SaveStringToFile('C:\Windows\log.txt', str, True);
end; [/no][/more]
Спасибо, Genri!
Теперь то, что - доктор прописал.
Цитата:
А я гадал, как Inno Setup - передать параметр, пробовал ^ и все другие способы, но | - не догадался.
Огромное спасибо и пока!
Теперь то, что - доктор прописал.
Цитата:
SergeyLS
Цитата:как сделать, чтобы одна процедура или одна функция работала для всего наборчика?
-- передавать имя файла в качестве параметра. Подробнее...
А я гадал, как Inno Setup - передать параметр, пробовал ^ и все другие способы, но | - не догадался.
Огромное спасибо и пока!
SergeyLS
Цитата:
Цитата:
А я гадал, как Inno Setup - передать параметр, пробовал ^ и все другие способы-- в хелп смотреть не пробовал? (Pascal Scripting: Scripted Constants)
Sid007
Цитата:
Ну, я предложил бы такой вариант [more=Примерчик ...]
function InitializeSetup(): Boolean;
var
regkey: String;
errorcode: Integer;
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Сталкер_is1', 'InstallLocation', regkey) then
begin
if MsgBox('Запустить Сталкер?', mbInformation, mb_okcancel) = idok then
begin
Exec(ExpandConstant(regkey) + '\bin\XR_3DA.exe', '', '', SW_Show, ewNoWait , errorcode);
Result := False;
Exit;
end else
begin
Result := False;
Exit;
end;
end;
Result := True;
end;
[/more]
Цитата:
приповторном запуске инсталятора он спрашиват "Запустить игру?".
Ну, я предложил бы такой вариант [more=Примерчик ...]
function InitializeSetup(): Boolean;
var
regkey: String;
errorcode: Integer;
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Сталкер_is1', 'InstallLocation', regkey) then
begin
if MsgBox('Запустить Сталкер?', mbInformation, mb_okcancel) = idok then
begin
Exec(ExpandConstant(regkey) + '\bin\XR_3DA.exe', '', '', SW_Show, ewNoWait , errorcode);
Result := False;
Exit;
end else
begin
Result := False;
Exit;
end;
end;
Result := True;
end;
[/more]
bull3t
Цитата:
Цитата:
Как обойти проблему с кодировкой?-- можешь попробовать использовать процедуру CharToOemBuff (описание в хелпе). Но, как уже сказали, лучше использовать запуск через Exec
htuos, serg_aka_lain, спасибо, так лучше, я добавил это в один [more=код][Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test
UninstallDisplayName=Test
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Files]
Source: Test\*; DestDir: {app}; Flags: ignoreversion recursesubdirs
[Code_]
const
MB_ICONINFORMATION = $40;
MB_ICONEXCLAMATION = $30;
MB_ICONQUESTION = $20;
MB_ICONSTOP = $10;
MB_ICONNONE = $0;
function MessageBox(hWnd: Integer; lpText, lpCaption: string; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';
procedure InitializeWizard;
var
ResultCode: Integer;
s, ResultStr:string;
begin
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test_is1', 'DisplayName', ResultStr)
then
begin
If ResultStr='Test'
then
begin
ResultStr:=RemoveQuotes(ResultStr);
if MessageBox(MainForm.Handle, 'Программа установки обнаружила уже установленное приложение.' #13#13 'Вы желаете предварительно удалить его?', 'Удаление Test', MB_ICONINFORMATION or mb_YesNo) = IDNo
then
begin
// Result:=False;
end
else
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test_is1', 'UninstallString', ResultStr)
then
begin
If ResultStr<>''
then
begin
ResultStr:=RemoveQuotes(ResultStr);
if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
then
MessageBox(MainForm.Handle, 'Ошибка удаления. ' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, приложение было перемещено, удалено или переименовано.', 'Удаление Test', MB_ICONEXCLAMATION or MB_OK);
end;
end;
end;
end;
end;
[/more], но при смене процедуры function InitializeSetup(): Boolean;
на procedure InitializeWizard; - она не понимает Result:=False; и тепери в первом окне с вопросом
'Вы желаете предварительно удалить его?' при нажатии на кнопку Нет "IDNo" задача не прекращается.
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test
UninstallDisplayName=Test
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Files]
Source: Test\*; DestDir: {app}; Flags: ignoreversion recursesubdirs
[Code_]
const
MB_ICONINFORMATION = $40;
MB_ICONEXCLAMATION = $30;
MB_ICONQUESTION = $20;
MB_ICONSTOP = $10;
MB_ICONNONE = $0;
function MessageBox(hWnd: Integer; lpText, lpCaption: string; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';
procedure InitializeWizard;
var
ResultCode: Integer;
s, ResultStr:string;
begin
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test_is1', 'DisplayName', ResultStr)
then
begin
If ResultStr='Test'
then
begin
ResultStr:=RemoveQuotes(ResultStr);
if MessageBox(MainForm.Handle, 'Программа установки обнаружила уже установленное приложение.' #13#13 'Вы желаете предварительно удалить его?', 'Удаление Test', MB_ICONINFORMATION or mb_YesNo) = IDNo
then
begin
// Result:=False;
end
else
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test_is1', 'UninstallString', ResultStr)
then
begin
If ResultStr<>''
then
begin
ResultStr:=RemoveQuotes(ResultStr);
if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
then
MessageBox(MainForm.Handle, 'Ошибка удаления. ' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, приложение было перемещено, удалено или переименовано.', 'Удаление Test', MB_ICONEXCLAMATION or MB_OK);
end;
end;
end;
end;
end;
[/more], но при смене процедуры function InitializeSetup(): Boolean;
на procedure InitializeWizard; - она не понимает Result:=False; и тепери в первом окне с вопросом
'Вы желаете предварительно удалить его?' при нажатии на кнопку Нет "IDNo" задача не прекращается.
Diawer
Обработчик InitializeWizard не понимает Result, используй вместо неё Abort;
Обработчик InitializeWizard не понимает Result, используй вместо неё Abort;
Приветствую гуру инсталяторского дела!
Ранее только читал этото форум, а теперь вот решил зарегиться, поскольку чем дальше в лес, тем больше вопросов.
1) Имеется код (автор не я, и в програмированнии я не слишком хорошо разбираюсь...) в котором определяются размеры окна инсталлера, расположение кнопок и прочее. Вот какая возникла пробема-пихаю в инсталлер ридми в формате .rtf (в нём есть фразы напечатанные другим цветом, выделенные жирным, гиперссылки...), но при работе инсталлятора весь документ отображается одинаковым шрифтом (единственное, что поучается, менять размер и тип шрифта). Как сделать, что бы ридми отображался в исходном варианте?
Вот кусок кода, где прописанны параметры страницы ридми:
with InfoBeforePage do begin
with InfoBeforeMemo do begin
Left:=0
Top:=24
Width:=570
Height:=277
//Font.Name:='Times New Roman'
//Font.Size:=12
ScrollBars:=ssVertical
end
Кстати, если делать инсталлер с помощью "Мастера", то все отображается нормально.
2) Хочу изменить расположение кнопки "Завершить" в конце, но Инно Сетап ругается на неизвестный идентификатор ButtonFinish.
К примеру кнопка "Отмена" в моем коде задается вот таким образом:
with CancelButton do begin
Left:=502
Top:=390
Width:=80
Height:=25
BringToFront
end
Заранее спасибо!
Ранее только читал этото форум, а теперь вот решил зарегиться, поскольку чем дальше в лес, тем больше вопросов.
1) Имеется код (автор не я, и в програмированнии я не слишком хорошо разбираюсь...) в котором определяются размеры окна инсталлера, расположение кнопок и прочее. Вот какая возникла пробема-пихаю в инсталлер ридми в формате .rtf (в нём есть фразы напечатанные другим цветом, выделенные жирным, гиперссылки...), но при работе инсталлятора весь документ отображается одинаковым шрифтом (единственное, что поучается, менять размер и тип шрифта). Как сделать, что бы ридми отображался в исходном варианте?
Вот кусок кода, где прописанны параметры страницы ридми:
with InfoBeforePage do begin
with InfoBeforeMemo do begin
Left:=0
Top:=24
Width:=570
Height:=277
//Font.Name:='Times New Roman'
//Font.Size:=12
ScrollBars:=ssVertical
end
Кстати, если делать инсталлер с помощью "Мастера", то все отображается нормально.
2) Хочу изменить расположение кнопки "Завершить" в конце, но Инно Сетап ругается на неизвестный идентификатор ButtonFinish.
К примеру кнопка "Отмена" в моем коде задается вот таким образом:
with CancelButton do begin
Left:=502
Top:=390
Width:=80
Height:=25
BringToFront
end
Заранее спасибо!
serg_aka_lain
Огромное спасиба ща буду пробовать.
Огромное спасиба ща буду пробовать.
Привет!
Genri
Цитата:
Меня смутило то, что это вроде бы Pascal, а в нем я немного разбираюсь.
Просто упустил из виду, что в DOS'е (^), а винде (|). С моей стороны это тем более непростительно, что я в свое время работал с модемами (прошивкии) и фидо-софтом.
Пока!
Genri
Цитата:
SergeyLS
Цитата:А я гадал, как Inno Setup - передать параметр, пробовал ^ и все другие способы
-- в хелп смотреть не пробовал? (Pascal Scripting: Scripted Constants)
Меня смутило то, что это вроде бы Pascal, а в нем я немного разбираюсь.
Просто упустил из виду, что в DOS'е (^), а винде (|). С моей стороны это тем более непростительно, что я в свое время работал с модемами (прошивкии) и фидо-софтом.
Пока!
SergeyLS
Не нужно в каждом посте писать "Привет" и "Пока", это тематический форум, а не переписка по E-mail.
Не нужно в каждом посте писать "Привет" и "Пока", это тематический форум, а не переписка по E-mail.
2 Genri
Спасибо! Все работает отлично)
Спасибо! Все работает отлично)
STALKER_HIGHLANDER
Цитата:
http://forum.ru-board.com/topic.cgi?forum=5&topic=4801&start=1980#16
http://forum.ru-board.com/topic.cgi?forum=5&topic=23235&start=60#20
Цитата:
ридми в формате .rtf-- http://forum.ru-board.com/topic.cgi?forum=5&topic=4801&start=1120#2
http://forum.ru-board.com/topic.cgi?forum=5&topic=4801&start=1980#16
http://forum.ru-board.com/topic.cgi?forum=5&topic=23235&start=60#20
Genri, я понимаю, что исходный скрипт будет длинный. Хотя бы посоветуйте, с каких процедур и функций его следует начать, а с геометрией компонентов постараюсь разобраться сам. Если Вам не сложно и есть свободное время, пожалуйста уделите внимание моей проблеме!
Kindly
Цитата:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program
[Files]
Source: BASS.dll; Flags: dontcopy
Source: test.mp3; Flags: dontcopy
[Code]
const
BASS_SAMPLE_LOOP = 4;
type
HSTREAM = DWORD;
function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';
function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset, offset1: DWORD; length, length1: DWORD; flags: DWORD): HSTREAM;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';
function BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';
function BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';
function BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';
procedure InitializeWizard();
var
Name1: string;
i: Integer;
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('test.mp3');
if BASS_Init(-1, 44100, 0, 0, 0) then
begin
BASS_Start();
Name1:=ExpandConstant('{tmp}\test.mp3');
i:=BASS_StreamCreateFile(FALSE, PChar(Name1), 0,0,0,0, 4);
if i <> 0 then BASS_ChannelPlay(i, True);
end;
end;
procedure DeInitializeSetup();
begin
BASS_Stop();
BASS_Free();
end; [/no][/more]
Artem_Butenko -- счас со временем сложно. Будет возможность, попробую что-нибудь набросать.
Цитата:
64 битные параметры, Inno ругается. Можно ли адаптировать под новую версию?-- все-таки адаптировать можно. Так как параметры передаются через стек, а в стеке они тупо ложатся один на другой, вместо одного параметра размерностью 8байт, можно передать два по 4байт (DWORD). [more][no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program
[Files]
Source: BASS.dll; Flags: dontcopy
Source: test.mp3; Flags: dontcopy
[Code]
const
BASS_SAMPLE_LOOP = 4;
type
HSTREAM = DWORD;
function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';
function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset, offset1: DWORD; length, length1: DWORD; flags: DWORD): HSTREAM;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';
function BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';
function BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';
function BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';
procedure InitializeWizard();
var
Name1: string;
i: Integer;
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('test.mp3');
if BASS_Init(-1, 44100, 0, 0, 0) then
begin
BASS_Start();
Name1:=ExpandConstant('{tmp}\test.mp3');
i:=BASS_StreamCreateFile(FALSE, PChar(Name1), 0,0,0,0, 4);
if i <> 0 then BASS_ChannelPlay(i, True);
end;
end;
procedure DeInitializeSetup();
begin
BASS_Stop();
BASS_Free();
end; [/no][/more]
Artem_Butenko -- счас со временем сложно. Будет возможность, попробую что-нибудь набросать.
serg_aka_lain
Цитата:
в том то и дело, что у меня почему то ругается на Abort;, почему не понятно.
Цитата:
Обработчик InitializeWizard не понимает Result, используй вместо неё Abort;
в том то и дело, что у меня почему то ругается на Abort;, почему не понятно.
[more=SotM[/more]
А второй вопросик что не доступен?? Помоги а! вопросик у меня такой файл уже загружен и запушен скажем Glass2k.exe и он находится в трее! Мне надо чтоб он пропускал ощибку что этот файл запушкен и его невозможно заменить!
А второй вопросик что не доступен?? Помоги а! вопросик у меня такой файл уже загружен и запушен скажем Glass2k.exe и он находится в трее! Мне надо чтоб он пропускал ощибку что этот файл запушкен и его невозможно заменить!
Artem_Butenko
Цитата:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program
[Files]
Source: {code:SrcDir}\*; DestDir: {app}; Flags: external
[Code]
var
DataDir: String;
Button: TButton;
Edit: TEdit;
function SrcDir(Param: String): String;
begin
Result := DataDir;
end;
procedure ButtonOnClick(Sender: TObject);
var
res: Boolean;
begin
DataDir := ExpandConstant('{src}');
res := BrowseForFolder('Выберите папку из списка и нажмите «ОК»', DataDir, True);
if res then
begin
Edit.Text := DataDir;
end;
end;
procedure InitializeWizard();
begin
Edit := TEdit.Create(WizardForm);
Edit.Top := WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + ScaleY(8);
Edit.Width := WizardForm.DirEdit.Width;
Edit.Text := ExpandConstant('{src}');
Edit.Parent := WizardForm.SelectDirPage;
Button := TButton.Create(WizardForm);
Button.Top := Edit.Top;
Button.Left := WizardForm.DirBrowseButton.Left;
Button.Width := WizardForm.DirBrowseButton.Width;
Button.Height := WizardForm.DirBrowseButton.Height;
Button.Caption := 'Source...';
Button.OnClick := @ButtonOnClick;
Button.Parent := WizardForm.SelectDirPage;
end;
function CheckSource(path: string): boolean;
begin
Result := DirExists(path) and
(IsAdminLoggedOn or IsPowerUserLoggedOn) and
FileExists(ExpandConstant('{sys}\calc.exe')) and
(GetMD5OfFile(ExpandConstant('{sys}\calc.exe')) = '829e4805b0e12b383ee09abdc9e2dc3c');
end;
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result:= True;
if CurPageID = wpSelectDir then
if Not CheckSource(Edit.Text) then
Result:= False
else
DataDir := Edit.Text;
end; [/no][/more] В функции CheckSource примеры различных проверок (заменяй на то, что тебе требуется)
Цитата:
с каких процедур и функций его следует начать-- [more][no]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program
[Files]
Source: {code:SrcDir}\*; DestDir: {app}; Flags: external
[Code]
var
DataDir: String;
Button: TButton;
Edit: TEdit;
function SrcDir(Param: String): String;
begin
Result := DataDir;
end;
procedure ButtonOnClick(Sender: TObject);
var
res: Boolean;
begin
DataDir := ExpandConstant('{src}');
res := BrowseForFolder('Выберите папку из списка и нажмите «ОК»', DataDir, True);
if res then
begin
Edit.Text := DataDir;
end;
end;
procedure InitializeWizard();
begin
Edit := TEdit.Create(WizardForm);
Edit.Top := WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + ScaleY(8);
Edit.Width := WizardForm.DirEdit.Width;
Edit.Text := ExpandConstant('{src}');
Edit.Parent := WizardForm.SelectDirPage;
Button := TButton.Create(WizardForm);
Button.Top := Edit.Top;
Button.Left := WizardForm.DirBrowseButton.Left;
Button.Width := WizardForm.DirBrowseButton.Width;
Button.Height := WizardForm.DirBrowseButton.Height;
Button.Caption := 'Source...';
Button.OnClick := @ButtonOnClick;
Button.Parent := WizardForm.SelectDirPage;
end;
function CheckSource(path: string): boolean;
begin
Result := DirExists(path) and
(IsAdminLoggedOn or IsPowerUserLoggedOn) and
FileExists(ExpandConstant('{sys}\calc.exe')) and
(GetMD5OfFile(ExpandConstant('{sys}\calc.exe')) = '829e4805b0e12b383ee09abdc9e2dc3c');
end;
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result:= True;
if CurPageID = wpSelectDir then
if Not CheckSource(Edit.Text) then
Result:= False
else
DataDir := Edit.Text;
end; [/no][/more] В функции CheckSource примеры различных проверок (заменяй на то, что тебе требуется)
Diawer
Цитата:
[more=Вот пример]
[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test
UninstallDisplayName=Test
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Code]
const
MB_ICONINFORMATION = $40;
MB_ICONEXCLAMATION = $30;
MB_ICONQUESTION = $20;
MB_ICONSTOP = $10;
MB_ICONNONE = $0;
function MessageBox(hWnd: Integer; lpText, lpCaption: string; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';
procedure InitializeWizard;
var
ResultCode: Integer;
ResultStr: string;
begin
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test_is1', 'DisplayName', ResultStr) then
begin
If ResultStr = 'Test' then
begin
ResultStr := RemoveQuotes(ResultStr);
if MessageBox(MainForm.Handle, 'Программа установки обнаружила уже установленное приложение.' #13#13 'Вы желаете предварительно удалить его?', 'Удаление Test', MB_ICONINFORMATION or mb_YesNo) = IDNo then
begin
Abort;
end else
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test_is1', 'UninstallString', ResultStr) then
begin
If ResultStr <> '' then
begin
ResultStr := RemoveQuotes(ResultStr);
if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then
MessageBox(MainForm.Handle, 'Ошибка удаления. ' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, приложение было перемещено, удалено или переименовано.', 'Удаление Test', MB_ICONEXCLAMATION or MB_OK);
end;
end;
end;
end;
end;
[/more] использования "Abort;" в процедуре InitializeWizard, всё нормально компилится и даже как ни странно, работает.
Цитата:
в том то и дело, что у меня почему то ругается на Abort;, почему не понятно.
[more=Вот пример]
[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test
UninstallDisplayName=Test
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Code]
const
MB_ICONINFORMATION = $40;
MB_ICONEXCLAMATION = $30;
MB_ICONQUESTION = $20;
MB_ICONSTOP = $10;
MB_ICONNONE = $0;
function MessageBox(hWnd: Integer; lpText, lpCaption: string; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';
procedure InitializeWizard;
var
ResultCode: Integer;
ResultStr: string;
begin
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test_is1', 'DisplayName', ResultStr) then
begin
If ResultStr = 'Test' then
begin
ResultStr := RemoveQuotes(ResultStr);
if MessageBox(MainForm.Handle, 'Программа установки обнаружила уже установленное приложение.' #13#13 'Вы желаете предварительно удалить его?', 'Удаление Test', MB_ICONINFORMATION or mb_YesNo) = IDNo then
begin
Abort;
end else
If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test_is1', 'UninstallString', ResultStr) then
begin
If ResultStr <> '' then
begin
ResultStr := RemoveQuotes(ResultStr);
if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then
MessageBox(MainForm.Handle, 'Ошибка удаления. ' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, приложение было перемещено, удалено или переименовано.', 'Удаление Test', MB_ICONEXCLAMATION or MB_OK);
end;
end;
end;
end;
end;
[/more] использования "Abort;" в процедуре InitializeWizard, всё нормально компилится и даже как ни странно, работает.
serg_aka_lain, да компилится, но попробуй его в действии, в появившемся окне когда нажимаешь НЕТ (когда должна сработать Abort;)
и окно закрытся, вылазит ошибка (Runtime error).
Чё к чему, не понятно.
и окно закрытся, вылазит ошибка (Runtime error).
Чё к чему, не понятно.
Diawer
Цитата:
Ну, я же говорил, что работает, пробовал и тестировал, у меня код отрабатывает нормально.
(под управлением Vista32)
Цитата:
но попробуй его в действии
Ну, я же говорил, что работает, пробовал и тестировал, у меня код отрабатывает нормально.
(под управлением Vista32)
-
Diawer
Цитата:
запускай скомпиленный ехе-шник, а не в режиме отладки
и прочитай хэлп по процедуре Abort, тогда поймешь почему ошибка вылезает
Цитата:
serg_aka_lain, да компилится, но попробуй его в действии, в появившемся окне когда нажимаешь НЕТ (когда должна сработать Abort;)
и окно закрытся, вылазит ошибка (Runtime error).
Чё к чему, не понятно.
запускай скомпиленный ехе-шник, а не в режиме отладки
и прочитай хэлп по процедуре Abort, тогда поймешь почему ошибка вылезает
Genri
В bass 2.4 есть возвращаемые значения типа QWORD, но length, length1: DWORD проходит только в параметрах...
Может лучше так?
type QWord = array[0..1] of DWord;
function StreamGetFilePosition(handle, mode: DWord): QWord;
external 'StreamGetFilePosition@files:BASS.dll stdcall delayload';
function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset, length: QWORD; flags: DWORD): HSTREAM;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';
В bass 2.4 есть возвращаемые значения типа QWORD, но length, length1: DWORD проходит только в параметрах...
Может лучше так?
type QWord = array[0..1] of DWord;
function StreamGetFilePosition(handle, mode: DWord): QWord;
external 'StreamGetFilePosition@files:BASS.dll stdcall delayload';
function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset, length: QWORD; flags: DWORD): HSTREAM;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';
Victor_Dobrov
Цитата:
Цитата:
type QWord = array[0..1] of DWord;-- насколько я знаю, массивы через стек не передаются. Во всяком случае, это у меня не работает.
Genri -- большое спасибо, великий Вы человек!!!
Genri
А как в препроцессоре получить имя основного скрипта? (для поиска в скрипте строк, находящихся после команды ISPP)
А как в препроцессоре получить имя основного скрипта? (для поиска в скрипте строк, находящихся после команды ISPP)
Victor_Dobrov
Цитата:
А по поводу QWORD - все решается достаточно просто:
type
QWord = Double;
Сразу как-то даже и не сообразил
Цитата:
как в препроцессоре получить имя основного скрипта?-- так сходу не скажу. Возможно, подойдет что-то из описанных в Inno Setup Preprocessor: Predefined and internally defined variables
А по поводу QWORD - все решается достаточно просто:
type
QWord = Double;
Сразу как-то даже и не сообразил
serg_aka_lain
htuos
работает, действительно надо запускать сам .exe, а не через инно. Спасибо.
Добавлено:
Есть ещё один вопрос, что надо дописать в [more=коде][Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Files]
Source: compiler:ISTask.dll; DestDir: {tmp}; Flags: dontcopy
[Code_]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
function InitializeSetup(): Boolean;
begin
If RunTask('Compil32.exe', false) then
begin
if MsgBox('Обнаружен запущенный экземпляр Test.'#13#13'Пожалуйста, закройте все экземпляры приложения, затем'#13#13'нажмите «OK», чтобы продолжить, или «Отмена», чтобы выйти.', mbError, mb_OkCancel) = idCancel then
Exit;
end;
Result:=True;
end; [/more] - появляется окно с предложением "Сначала выгрузить", надо что бы нажимая на кнопку "Да",
окно Не Закрывалось если программа Compil32.exe не выгружена (то есть нажималась в холостую) до момента закрытия
Compil32.exe пользователем.
htuos
работает, действительно надо запускать сам .exe, а не через инно. Спасибо.
Добавлено:
Есть ещё один вопрос, что надо дописать в [more=коде][Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Files]
Source: compiler:ISTask.dll; DestDir: {tmp}; Flags: dontcopy
[Code_]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
function InitializeSetup(): Boolean;
begin
If RunTask('Compil32.exe', false) then
begin
if MsgBox('Обнаружен запущенный экземпляр Test.'#13#13'Пожалуйста, закройте все экземпляры приложения, затем'#13#13'нажмите «OK», чтобы продолжить, или «Отмена», чтобы выйти.', mbError, mb_OkCancel) = idCancel then
Exit;
end;
Result:=True;
end; [/more] - появляется окно с предложением "Сначала выгрузить", надо что бы нажимая на кнопку "Да",
окно Не Закрывалось если программа Compil32.exe не выгружена (то есть нажималась в холостую) до момента закрытия
Compil32.exe пользователем.
Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
Предыдущая тема: Презентация
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.