Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: nOobCrafter
Дата сообщения: 01.09.2008 15:55
Кто может помоч с записью в лог-файл?.. Вопрос описан выше.
Автор: Genri
Дата сообщения: 01.09.2008 16:58
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]
Автор: SergeyLS
Дата сообщения: 01.09.2008 17:54
Спасибо, Genri!
Теперь то, что - доктор прописал.

Цитата:
SergeyLS

Цитата:как сделать, чтобы одна процедура или одна функция работала для всего наборчика?
-- передавать имя файла в качестве параметра. Подробнее...

А я гадал, как Inno Setup - передать параметр, пробовал ^ и все другие способы, но | - не догадался.
Огромное спасибо и пока!
Автор: Genri
Дата сообщения: 01.09.2008 18:20
SergeyLS

Цитата:
А я гадал, как Inno Setup - передать параметр, пробовал ^ и все другие способы
-- в хелп смотреть не пробовал? (Pascal Scripting: Scripted Constants)
Автор: serg_aka_lain
Дата сообщения: 01.09.2008 18:34
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]

Автор: Genri
Дата сообщения: 01.09.2008 18:39
bull3t

Цитата:
Как обойти проблему с кодировкой?
-- можешь попробовать использовать процедуру CharToOemBuff (описание в хелпе). Но, как уже сказали, лучше использовать запуск через Exec
Автор: Diawer
Дата сообщения: 01.09.2008 20:16
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" задача не прекращается.
Автор: serg_aka_lain
Дата сообщения: 01.09.2008 20:43
Diawer

Обработчик InitializeWizard не понимает Result, используй вместо неё Abort;
Автор: STALKER_HIGHLANDER
Дата сообщения: 02.09.2008 02:41
Приветствую гуру инсталяторского дела!

Ранее только читал этото форум, а теперь вот решил зарегиться, поскольку чем дальше в лес, тем больше вопросов.

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

Заранее спасибо!
Автор: Sid007
Дата сообщения: 02.09.2008 07:06
serg_aka_lain

Огромное спасиба ща буду пробовать.
Автор: SergeyLS
Дата сообщения: 02.09.2008 07:09
Привет!

Genri

Цитата:
SergeyLS

Цитата:А я гадал, как Inno Setup - передать параметр, пробовал ^ и все другие способы
-- в хелп смотреть не пробовал? (Pascal Scripting: Scripted Constants)

Меня смутило то, что это вроде бы Pascal, а в нем я немного разбираюсь.
Просто упустил из виду, что в DOS'е (^), а винде (|). С моей стороны это тем более непростительно, что я в свое время работал с модемами (прошивкии) и фидо-софтом.

Пока!
Автор: SotM
Дата сообщения: 02.09.2008 07:21
SergeyLS
Не нужно в каждом посте писать "Привет" и "Пока", это тематический форум, а не переписка по E-mail.
Автор: nOobCrafter
Дата сообщения: 02.09.2008 08:56
2 Genri
Спасибо! Все работает отлично)
Автор: Genri
Дата сообщения: 02.09.2008 09:27
STALKER_HIGHLANDER

Цитата:
ридми в формате .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
Автор: Artem_Butenko
Дата сообщения: 02.09.2008 14:41
Genri, я понимаю, что исходный скрипт будет длинный. Хотя бы посоветуйте, с каких процедур и функций его следует начать, а с геометрией компонентов постараюсь разобраться сам. Если Вам не сложно и есть свободное время, пожалуйста уделите внимание моей проблеме!
Автор: Genri
Дата сообщения: 02.09.2008 16:52
Kindly

Цитата:
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 -- счас со временем сложно. Будет возможность, попробую что-нибудь набросать.

Автор: Diawer
Дата сообщения: 02.09.2008 16:57
serg_aka_lain

Цитата:
Обработчик InitializeWizard не понимает Result, используй вместо неё Abort;

в том то и дело, что у меня почему то ругается на Abort;, почему не понятно.
Автор: KurtWagner
Дата сообщения: 02.09.2008 17:38
[more=SotM[/more]
А второй вопросик что не доступен?? Помоги а! вопросик у меня такой файл уже загружен и запушен скажем Glass2k.exe и он находится в трее! Мне надо чтоб он пропускал ощибку что этот файл запушкен и его невозможно заменить!
Автор: Genri
Дата сообщения: 02.09.2008 17:59
Artem_Butenko

Цитата:
с каких процедур и функций его следует начать
-- [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 примеры различных проверок (заменяй на то, что тебе требуется)
Автор: serg_aka_lain
Дата сообщения: 02.09.2008 19:05
Diawer

Цитата:
в том то и дело, что у меня почему то ругается на 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, всё нормально компилится и даже как ни странно, работает.
Автор: Diawer
Дата сообщения: 02.09.2008 20:35
serg_aka_lain, да компилится, но попробуй его в действии, в появившемся окне когда нажимаешь НЕТ (когда должна сработать Abort;)
и окно закрытся, вылазит ошибка (Runtime error).
Чё к чему, не понятно.



Автор: serg_aka_lain
Дата сообщения: 02.09.2008 21:03
Diawer

Цитата:
но попробуй его в действии


Ну, я же говорил, что работает, пробовал и тестировал, у меня код отрабатывает нормально.
(под управлением Vista32)
Автор: Chanka
Дата сообщения: 02.09.2008 22:04
-
Автор: htuos
Дата сообщения: 02.09.2008 23:37
Diawer

Цитата:
serg_aka_lain, да компилится, но попробуй его в действии, в появившемся окне когда нажимаешь НЕТ (когда должна сработать Abort;)
и окно закрытся, вылазит ошибка (Runtime error).
Чё к чему, не понятно.

запускай скомпиленный ехе-шник, а не в режиме отладки
и прочитай хэлп по процедуре Abort, тогда поймешь почему ошибка вылезает
Автор: Victor_Dobrov
Дата сообщения: 03.09.2008 01:04
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';
Автор: Genri
Дата сообщения: 03.09.2008 16:35
Victor_Dobrov

Цитата:
type QWord = array[0..1] of DWord;
-- насколько я знаю, массивы через стек не передаются. Во всяком случае, это у меня не работает.
Автор: Artem_Butenko
Дата сообщения: 03.09.2008 16:56
Genri -- большое спасибо, великий Вы человек!!!
Автор: Victor_Dobrov
Дата сообщения: 03.09.2008 17:11
Genri
А как в препроцессоре получить имя основного скрипта? (для поиска в скрипте строк, находящихся после команды ISPP)
Автор: Genri
Дата сообщения: 03.09.2008 17:24
Victor_Dobrov

Цитата:
как в препроцессоре получить имя основного скрипта?
-- так сходу не скажу. Возможно, подойдет что-то из описанных в Inno Setup Preprocessor: Predefined and internally defined variables

А по поводу QWORD - все решается достаточно просто:
type
QWord = Double;

Сразу как-то даже и не сообразил
Автор: Diawer
Дата сообщения: 03.09.2008 23:39
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 пользователем.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Презентация


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.