PDA

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


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

Johny777
28-09-2012, 19:16
Ivan_009,
описание использования читай!



/// AskForStyle(стиль по умолчанию - 0 или 1, название заголовка окна, название первого стиля, название второго стиля) возвращает 0, 1, 2
wAnswer := AskForStyle(0,'какой стиль юзать?','Steam стиль','White стиль');
/////////////////////////////////////////////////// 0 /////////\\\ 1 //////

/// Функция вернёт число равное 0 - нажали на отмену, 1 - 1 + индекс выбранного айтема(0+1) = стиль 1, 2 - индекс выбранного айтема (1+1) - стиль 2

....

procedure InitializeWizard();
begin
/// здесь общий код для двух стилей

if wAnswer = 1 then
begin
/// код для первого слитя

Cvet:='_steam';

MsgBox('будет использован стиль 1', mbInformation, MB_OK);
end else
begin
/// код для вторго слитя

Cvet:='_white';

MsgBox('будет использован стиль 2', mbInformation, MB_OK);
end;

end;


вот упрости функцияю, а то у меня малость запутано с этим нулём
чтоб вместо стиля по умолчанию - 0 или 1 было 1 или 2
впиши в функции заместо ItemIndex := DefStyle; это ItemIndex := DefStyle - 1; и в первом параметре отправляй стиль по умолчанию (выбранный по умолчанию айтем комбобокса)
те для стиля 1 - AskForStyle(1, ...
для стиля 2 - AskForStyle(2, ...

я ввёл в ф-ю "стиль по умолчанию" тк у тебя 100% один из двух стилее более рекомендованный и чтоб он был заранее выбран при первом запуске

Dima2009
28-09-2012, 19:27
[*Code]
Function InitializeSetup: Boolean;
begin
Result := True;
If FileExists(ExpandConstant('{src}\file.log'))) then begin
MsgBox('Отсутсвуют файлы установки!' + #13#10 + 'Установка прекращена', mbError, mb_Ok);
Result := False;
end
else Result := True;
// функция InitializeSetup - начальная, выполняется самой первой после запуска инсталлера, если она вернет false - инсталлер закроется и не пискнет
end; »

R.i.m.s.k.y.
28-09-2012, 19:31
Dima2009, скобка лишняя, две открываются и три закрываются

Dima2009
28-09-2012, 19:40
Dima2009, »
тут наоборот получаеться без файла устанавливаеться а с файлом нет.

Johny777
28-09-2012, 19:43
ут наоборот получаеться без файла устанавливаеться а с файлом нет. »
If not FileExists(ExpandConstant('{src}\file.log'))

R.i.m.s.k.y., Dima2009,
можно записать покороче (спасибо El Sanchez-у) :) тк FileExists возвращает булев значение которое можно напрямую передать в понимающий только эти значения в функции InitializeSetup зарезервированной переменной Result

function InitializeSetup(): Boolean;
begin
Result := FileExists(ExpandConstant('{src}\file.log'));
if not Result then MsgBox('Отсутсвуют файлы установки!' + #13#10 + 'Установка прекращена', mbError, mb_Ok);
end;

Ivan_009
28-09-2012, 19:48
Johny777, При нажатии на отмена вот такая ошибка...

R.i.m.s.k.y.
28-09-2012, 19:49
Johny777, да можно и так, только вот бывает глюк что без явного Result := True инсталлер самозакрывается.
Поэтому во избежание я всегда явно указываю где False а где True

Dima2009, пятницо, сам понимаешь ;)
[*Code]
Function InitializeSetup: Boolean;
begin
Result := True;
If ( not FileExists(ExpandConstant('{src}\file.log')) ) then begin
MsgBox('Отсутсвуют файлы установки!' + #13#10 + 'Установка прекращена', mbError, mb_Ok);
Result := False;
end
else Result := True;
// функция InitializeSetup - начальная, выполняется самой первой после запуска инсталлера, если она вернет false - инсталлер закроется и не пискнет
end;

Dima2009
28-09-2012, 19:57
R.i.m.s.k.y., Johny777 - Спасибо вам за помощь!

А реально написать код деинсталлятора как у NSIS

Nasedkin Nikita
29-09-2012, 08:22
Люди!!! Подскажите, пожайлуста как создать такой инсталятор http://s1.ipicture.ru/uploads/20120925/qz9Z0MRC.png

ispolin
29-09-2012, 12:30
вот задача
[Files]
Source: {tmp}\java6x86.exe; DestDir: {tmp}; Components: java6x86; MinVersion: 0.0,5.01; Flags: deleteafterinstall
Source: {tmp}\java6x64.exe; DestDir: {tmp}; Components: java6x64; MinVersion: 0.0,5.01; Flags: deleteafterinstall 64bit
Source: {tmp}\java7x64.exe; DestDir: {tmp}; Components: java7x64; MinVersion: 0.0,5.01; Flags: deleteafterinstall 64bit
Source: {tmp}\java7x86.exe; DestDir: {tmp}; Components: java7x86; MinVersion: 0.0,5.01; Flags: deleteafterinstall
[Run]
Filename: {tmp}\java6x86.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 6 устанавливается...Ждите...; Components: java6x86; MinVersion: 0.0,5.01
Filename: {tmp}\java6x64.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 6 устанавливается...Ждите...; Components: java6x64; MinVersion: 0.0,5.01
Filename: {tmp}\java7x64.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 7 устанавливается...Ждите...; Components: java7x64; MinVersion: 0.0,5.01
Filename: {tmp}\java7x86.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 7 устанавливается...Ждите...; Components: java7x86; MinVersion: 0.0,5.01
[Components]
Name: java6x86; Description: Java(TM) Platform SE 6 Update 35 для x86 систем; Check: IsX86; MinVersion: 0.0,5.01
Name: java6x64; Description: Java(TM) Platform SE 6 Update 35 для x64 систем; Check: IsX64; MinVersion: 0.0,5.01
Name: java7x64; Description: Java(TM) Platform SE 7 Update 7 для x64 систем; Check: IsX64; MinVersion: 0.0,5.01
Name: java7x86; Description: Java(TM) Platform SE 7 Update 7 для x86 систем; Check: IsX86; MinVersion: 0.0,5.01

после запуска программы, она автоматом определит разрядность и выведет подходящие компоненты для установки, однако выводится будут оба
Java(TM) Platform SE 6 Update 35 для x86 систем
Java(TM) Platform SE 7 Update 7 для x86 систем
и это правильно, но нужно при выборе одной версии, запретить установку другой т.е , чтобы невозможно было поставить чекбокс на обе сразу
помогите плиз

R.i.m.s.k.y.
29-09-2012, 13:25
ispolin, читай в хелпе про флаг exclusive
[Components]
Name: x86; Description: Java(TM) для x86 систем; Check: IsX86; MinVersion: 0.0,5.01;
Name: x86\java6x86; Description: Java(TM) Platform SE 6 Update 35 для x86 систем; Check: IsX86; MinVersion: 0.0,5.01; Flags: exclusive
Name: x86\java7x86; Description: Java(TM) Platform SE 7 Update 7 для x86 систем; Check: IsX86; MinVersion: 0.0,5.01; Flags: exclusive
Name: x64; Description: Java(TM) для x64 систем; Check: IsX64; MinVersion: 0.0,5.01;
Name: x64\java6x64; Description: Java(TM) Platform SE 6 Update 35 для x64 систем; Check: IsX64; MinVersion: 0.0,5.01; Flags: exclusive
Name: x64\java7x64; Description: Java(TM) Platform SE 7 Update 7 для x64 систем; Check: IsX64; MinVersion: 0.0,5.01; Flags: exclusive

[Files]
Source: {tmp}\java6x86.exe; DestDir: {tmp}; Components: x86\java6x86; MinVersion: 0.0,5.01; Flags: deleteafterinstall
Source: {tmp}\java6x64.exe; DestDir: {tmp}; Components: x64\java6x64; MinVersion: 0.0,5.01; Flags: deleteafterinstall 64bit
Source: {tmp}\java7x64.exe; DestDir: {tmp}; Components: x64\java7x64; MinVersion: 0.0,5.01; Flags: deleteafterinstall 64bit
Source: {tmp}\java7x86.exe; DestDir: {tmp}; Components: x86\java7x86; MinVersion: 0.0,5.01; Flags: deleteafterinstall

[Run]
Filename: {tmp}\java6x86.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 6 устанавливается...Ждите...; Components: x86\java6x86; MinVersion: 0.0,5.01
Filename: {tmp}\java6x64.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 6 устанавливается...Ждите...; Components: x64\java6x64; MinVersion: 0.0,5.01
Filename: {tmp}\java7x64.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 7 устанавливается...Ждите...; Components: x64\java7x64; MinVersion: 0.0,5.01
Filename: {tmp}\java7x86.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 7 устанавливается...Ждите...; Components: x86\java7x86; MinVersion: 0.0,5.01

ispolin
29-09-2012, 13:54
Здорово!
задача посложнее

[Files]
Source: {tmp}\DotNet.exe; DestDir: {tmp}; Components: framework; MinVersion: 0.0,5.01; Flags: deleteafterinstall
[Run]
Filename: {tmp}\DotNet.exe; Parameters: /S /nolang; StatusMsg: Microsoft .NET Framework устанавливается...Ждите...; Components: framework; MinVersion: 0.0,5.01
[Components]
Name: framework; Description: Microsoft .NET Framework 1.1 - 4.0; Check: IsX86; MinVersion: 0.0,5.01

нужно реализовать запуск с каждым ключом по отдельности, с запретом одновременного запуска
http://forum.oszone.net/thread-46682.html

R.i.m.s.k.y.
29-09-2012, 14:00
ispolin
a) не надо ставить фреймворки 1-3,5, длостаточно поставить оригинальный .Net frameWork 3.5SP1, в нем уже содержатся все предудыщие пропатченные до SP2
б) пиши в RUN несколько строчек с нужными экзешниками с флагом waituntilterminated, инно выполняет скрипт сверху вниз. Этот флаг и так задан неявно пока не поставишь флаг shellexec

Aleksoid1978
29-09-2012, 14:01
Всем привет. Подскажите, могу ли в функции

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);

вызывать

if IsTaskSelected('pintotaskbar') then


Вернее не то что могу ли, а будет ли от такого вызова толк. Отработает ли что при установке я ткнул нужнуб галку(сработало IsTaskSelected('pintotaskbar')).

Заранее спасибо.

El Sanchez

Вот окончательный мой код, работает и на х86 и на х64 системах, устанавливается и удаляется с таскбара корректно. Спасибо за помощь

// thank for code to "El Sanchez" from forum.oszone.net
procedure PinToTaskbar(Filename: String; IsPin: Boolean);
var
hInst: THandle;
buf: array [0..255] of char;
i, Res: Integer;
strVerb, sVBSFile: String;
objShell, colVerbs, oFile: Variant;
begin
if (GetWindowsVersion shr 24 < 6) or ((GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF < 1)) then Exit; // Windows 7 check

if not FileExists(Filename) then Exit;

if IsPin then Res := 5386 else Res := 5387;
begin
hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
if hInst <> 0 then
try
for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
try
objShell := CreateOleObject('Shell.Application');
except
ShowExceptionMessage;
Exit;
end;
oFile := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename));
colVerbs := oFile.Verbs;

if IsWin64 and (Pos (ExpandConstant ('{pf64}\'), Filename) = 1) then begin
sVBSFile := GenerateUniqueName (GetTempDir, 'mpc_be.vbs');
SaveStringToFile (sVBSFile, \
'Set oShell=CreateObject("Shell.Application")' + #13 + \
'Set oVerbs=oShell.NameSpace("' + ExtractFileDir (Filename) + '").ParseName("' + ExtractFileName (Filename) + '").Verbs' + #13 + \
'For Each oVerb In oVerbs' + #13 + \
' If (oVerb="' + strVerb + '") Then' + #13 + \
' oVerb.DoIt' + #13 + \
' Exit For' + #13 + \
' End If' + #13 + \
'Next' , False);

exec( ExpandConstant ('{win}\Sysnative\cscript.exe'), '"' + sVBSFile + '" /B', '', SW_HIDE, ewWaitUntilTerminated, i);
DeleteFile (sVBSFile);
end else begin
for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then begin
if (IsPin and oFile.IsLink) then
DeleteFile (ExpandConstant ('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName (Filename));

colVerbs.Item[i].DoIt;
Break;
end;
end;
finally
FreeDLL(hInst);
end;
end;
end;

SatHan
29-09-2012, 17:17
я б так сделал: »не то. в случае может быть много обновлений. каких нибудь переменных в роде Update_%.%.%.exe или Update_*.*.*.exe нет?


такой вопрос. как сделать чтоб инсталятор обнаруживал запущенную программу и если она запущена то инсталятор выдал сообщение с предупреждением и закрылся?

Подскажите, пожайлуста как создать такой инсталятор »панель нужна?
взято отсюда (http://narod.ru/disk/7844921001/Inno%20Faq%201.4.chm.html) то что в первом посте.
в вложении прикрутил.

Gnom_aka_Lexander
29-09-2012, 19:48
Люди!!! Подскажите, пожайлуста как создать такой инсталятор »
Это скрипт Need for Speed™ Undercover (http://rghost.ru/2139011) Юршата, только поменяны картинки и стиль, не более. хотя, да, для многих замена картинки является поводом достаточным, чтоб решить, что скрипт уже совершенно другой, как это ни прискорбно. Куда мы катимся?

SARATOVSKY
29-09-2012, 20:22
А можно ли отрезать от страницы, к примеру SelectDirPage, маленький кусок размером, к примеру 190*30? Просто мне на этом месте InnerPage нужна, SelectDirPage загораживает!!! Спасибо!

Johny777
30-09-2012, 01:26
каких нибудь переменных в роде Update_%.%.%.exe или Update_*.*.*.exe нет? »
хз

ну да ладно
в случае может быть много обновлений. »
намутячил код :) (на основе модифицированного поиска по маске из шапки от Serega) и "Получение всех файлов в папке, с полными путями" Gnom_aka_Lexander-а

работает так
ищем сначала файлы по расширению (в данном случае .exe)
используя имена файлов добавляем эти самые имена в цикле в чеклистбокс состоящий из одних чекбоксов
имя файла = имя чекбокса
тут же это имя файла и путь пишется в статичный массив записей длиной в 201 элемент (извиняй. Здесь подошёл бы лучше динамичный, но я только начал знакомится с массивами)
те у нас например снаружи 10 экзешников(апдейтов) = 10 чекбоксов = 10 записей в массиве(в массиве с полными путями)

ну и на этапе утановки каком хочешь мы в зависимости от отмеченного чекбокса(-ов) запускаем тот или иной экзешник

код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup


[ Code]
var
UpudatePage: TWizardPage;
updList: TNewCheckListBox;
arrUpd:array [0..200] of string;

procedure Find_Files_By_Mask(Path,Mask:string;cbBox:TNewCheckListBox);
var
FSR: TFindRec;
FindResult: Boolean;
i:Integer;
begin
i := 0;

if Path[Length(Path)] <> '\' then Path:= Path + '\';
FindResult:= FindFirst(Path + Mask, FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
cbBox.AddCheckBox(FSR.Name, '', 0, True, True, True, True, nil);
arrUpd[i] := Path + FSR.Name;
i := i + 1;
end;
FindResult:= FindNext(FSR);
end;
finally
FindClose(FSR);
end;
end;


procedure InitializeWizard();
begin
UpudatePage := CreateCustomPage(wpWelcome, 'Список Файлов обновления', 'что установить ?');

updList := TNewCheckListBox.Create(WizardForm);
with updList do
begin
Parent := UpudatePage.Surface;
SetBounds(ScaleX(0),ScaleY(0),UpudatePage.SurfaceWidth,UpudatePage.SurfaceHeight - ScaleY(30));
end;

Find_Files_By_Mask(ExpandConstant('{src}'),'*.exe',updList);

updList.Items.Delete(updList.Items.IndexOf('setup.exe'));

MsgBox(arrUpd[1], mbInformation, MB_OK);
end;



procedure CurStepChanged(CurStep: TSetupStep);
var
i, ErrorCode: Integer;
begin
i:=0
if CurStep = ssInstall then
begin
repeat
if updList.Checked[i] then Exec(arrUpd[i], '', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
MsgBox(IntToStr(i), mbInformation, MB_OK);
i := i + 1;
until i = updList.ItemCount;
end;
end;


как сделать чтоб инсталятор обнаруживал запущенную программу и если она запущена то инсталятор выдал сообщение с предупреждением и закрылся? »
в шапке есть 2 кода на определение работающего процесса
оба кода возвращают булев значение
попробуй ка сам на основе этого сообщения с кодом и функций из шапки сделать себе пример
http://forum.oszone.net/post-1996300-1067.html

SatHan
30-09-2012, 07:19
попробуй ка сам на основе этого сообщения с кодом »я пробовал сам на основе рунтаск. вот код
[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: dontcopy

[#Code]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
If RunTask('notepad.exe', false) then
begin
MsgBox('блокнот запущен. пожалуйста закройте блокнот и запустите установку заново.', mbInformation, MB_OK);
Exit;
end;
Result:=True;
end;на большее мозгов не хватает.это по крайне мере лучший вариант
не устраивает ISTask.dll. хотелось бы без него обойтись еси можна.

R.i.m.s.k.y.
30-09-2012, 08:07
не устраивает ISTask.dll. хотелось бы без него обойтись еси можна. »
const
TH32CS_SNAPPROCESS = $2;
INVALID_HANDLE_VALUE = -1;

type
TPROCESSENTRY32 = record
dwSize, cntUsage, th32ProcessID: DWORD;
th32DefaultHeapID: Longint;
th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
pcPriClassBase: Longint;
dwFlags: DWORD;
szExeFile: array [0..259] of char;
end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): Boolean; external 'CloseHandle@kernel32.dll stdcall';


function IsProcessRunning(FileName: String): Boolean;
var
hProcessSnap: THandle;
pe32: TPROCESSENTRY32;
szExeFile: String;
begin
hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
pe32.dwSize := sizeof(pe32);
if not Process32First(hProcessSnap, pe32) then Exit;
while not Result and Process32Next(hProcessSnap, pe32) do
begin
szExeFile := '';
while not (pe32.szExeFile[Length(szExeFile)] = #0) do szExeFile := szExeFile + pe32.szExeFile[Length(szExeFile)];
Result := LowerCase(FileName) = LowerCase(szExeFile);
end;
CloseHandle(hProcessSnap);
end;

function InitializeSetup(): Boolean;
begin
If IsProcessRunning('notepad.exe') then begin
MsgBox('блокнот запущен. пожалуйста закройте блокнот и запустите установку заново.', mbInformation, MB_OK);
Exit;
end;
Result:=True;
end;




© OSzone.net 2001-2012