Войти

Показать полную графическую версию : Скрипты 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

L1nk3R
03-07-2012, 11:00
используй дизайнер расширенной http://forum.oszone.net/thread-148707-30.html версии
создай там панель и настрой BevelInner и BevelOuter »Расширенный это там где Редактор форм?
Что за BevelInner и BevelOuter, как мне их найти?

L1nk3R
03-07-2012, 11:19
Да бевел это. »Что-то разобратся не могу что мне с ними сделать.

alert30
03-07-2012, 11:44
Что-то разобратся не могу что мне с ними сделать. »
Ну так скрипт от nik1967 копипастить в секции Code.

nik1967
03-07-2012, 12:00
Что-то разобратся не могу что мне с ними сделать. »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Redist\DirectXCheck; Description: Обновить DirectX
Name: Redist\PhysXCheck; Description: Установить Nvidia PhysX

[_Code]
procedure InitializeWizard();
begin
with TBevel.Create(WizardForm) do begin
SetBounds(ScaleX(0),ScaleY(30),ScaleX(365),ScaleY(80));
Shape:= bsBox;
Parent:= WizardForm.SelectTasksPage;
end;
with WizardForm.TasksList do
SetBounds(ScaleX(5),ScaleY(35),ScaleX(350),ScaleY(70));
end;

L1nk3R
03-07-2012, 13:23
Всем спасибо разобрался наконец. В итоге вот что мне нужно было
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Redist\DirectXCheck; Description: Обновить DirectX
Name: Redist\PhysXCheck; Description: Установить Nvidia PhysX

[_Code]
procedure InitializeWizard();
begin
WizardForm.TasksList.BorderStyle := bsSingle;
with WizardForm.TasksList do SetBounds(ScaleX(5),ScaleY(35),ScaleX(350),ScaleY(70));
end;

Johny777, nik1967, оказывается не Bevel это а BorderStyle.

nik1967
03-07-2012, 14:33
L1nk3R,
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Redist\DirectXCheck; Description: Обновить DirectX
Name: Redist\PhysXCheck; Description: Установить Nvidia PhysX

[ Code]
procedure InitializeWizard();
begin
with WizardForm.TasksList do begin
Height := ScaleY(70);
BorderStyle := bsSingle;
end;
end;

Johny777
03-07-2012, 19:26
Да бевел это. »
всё мимо
В итоге оказалось, что это стиль границы листбокса задач :grin:

====================================================================================================


У меня возник вопрос
при удалении игры деинсталятор ориентируется на экзешник
есть экзешник там = есть и игра = есть активный чекбокс на форме
если же в диспетчере задач висит процесс этого самого экзешника и при этом попытаться его удалить, то удаляется всё кроме него, а он остаётся
те никаких ошибок и прочего

подскажите пожалуйста как определить директорию расположения экзешника, процесс которого висит
(определение процесса уже есть в шапке в 2-х вариантах)
почему именно папку?
дело в том, что речь идёт о процессе hl2.exe а он может быть и не от моей пиратки, а от другой или от steam версии
и было бы некрасиво завершать процесс слева, удаляя справа

также прошу не помогать мне если писанина подобного кода является трудоёмкой задачей, тк это "косметическая" правка и нацелена она
на устранение хоть и надеюсь редкого, но возможного конфликта.

El Sanchez
03-07-2012, 22:04
Johny777, определение рабочей папки процесса:


[Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
TH32CS_SNAPPROCESS = $2;
INVALID_HANDLE_VALUE = -1;
PROCESS_QUERY_INFORMATION = $400;
PROCESS_VM_READ = $10;
MAX_PATH = 260;

type
TPROCESSENTRY32 = record
dwSize, cntUsage, th32ProcessID: DWORD;
th32DefaultHeapID: Longint;
th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
pcPriClassBase: Longint;
dwFlags: DWORD;
szExeFile: array [0..MAX_PATH-1] of Сhar;
end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
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';
#endif
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetProcessImageFileName(hProcess: THandle; var lpImageFileName: Char; nSize: DWORD): DWORD; external 'GetProcessImageFileName{#A}@psapi.dll stdcall';
function GetLogicalDriveStrings(nBufferLength: DWORD; var lpBuffer: Char): DWORD; external 'GetLogicalDriveStrings{#A}@kernel32.dll stdcall';
function QueryDosDevice(lpDeviceName: String; var lpTargetPath: Char; ucchMax: DWORD): DWORD; external 'QueryDosDevice{#A}@kernel32.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';

function CharArrayToString(aChar: array of Char): String;
begin
Result := '';
while not (aChar[Length(Result)] = #0) do Result := Result + aChar[Length(Result)];
end;

function GetProcessWorkingDirectory(ProcessName: String): TArrayOfString;
var
hProcessSnap, hProc: THandle;
pe32: TPROCESSENTRY32;
szExeFile, szDrives, szDeviceName: array [0..MAX_PATH-1] of Char;
sDeviceName: String;
i, iLen: DWORD;
begin
SetArrayLength(Result, 0);
hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
pe32.dwSize := sizeof(pe32);
if not Process32First(hProcessSnap, pe32) then Exit;
while Process32Next(hProcessSnap, pe32) do
begin
if CompareText(CharArrayToString(pe32.szExeFile), ProcessName) = 0 then
begin
hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pe32.th32ProcessID);
if GetProcessImageFileName(hProc, szExeFile[0], MAX_PATH) = 0 then Exit;
SetArrayLength(Result, GetArrayLength(Result)+1);
Result[GetArrayLength(Result)-1] := CharArrayToString(szExeFile);
iLen := GetLogicalDriveStrings(MAX_PATH, szDrives[0]);
if iLen = 0 then Exit;
i := 0;
while i <= iLen-3 do
begin
if QueryDosDevice(szDrives[i] + ':', szDeviceName[0], MAX_PATH) > 0 then
begin
sDeviceName := CharArrayToString(szDeviceName);
if (Length(sDeviceName) <= Length(Result[GetArrayLength(Result)-1])) and
(Pos(sDeviceName, Result[GetArrayLength(Result)-1]) = 1) then
begin
StringChangeEx(Result[GetArrayLength(Result)-1], sDeviceName, szDrives[i] + ':', True);
Result[GetArrayLength(Result)-1] := RemoveBackSlash(ExtractFilePath(Result[GetArrayLength(Result)-1]));
Break;
end;
end;
i := i + 4;
end;
CloseHandle(hProc);
end;
end;
CloseHandle(hProcessSnap);
end;

procedure InitializeWizard();
var
szArray: TArrayOfString;
i: Integer;
begin
//хочу знать откуда калькуляторы запущены
szArray := GetProcessWorkingDirectory('calc.exe');
if GetArrayLength(szArray) > 0 then for i := 0 to GetArrayLength(szArray)-1 do MsgBox(szArray[i], mbInformation, MB_OK);
end;

Johny777
04-07-2012, 00:31
El Sanchez, огромное спасибо за функцию
результат:
if GetProcessWorkingDirectory('hl2.exe') = ExpandConstant('{app}\common\half-life 2') then Exec('taskkill', '/f /im hl2.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
работает отлично! :)
надеюсь тебе было не в напряг

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,

можно пожалуйста ещё 2 мелких вопроса?

1. в чём разница между ErrorCode и ResultCode
Если они оба сравниваются только с 0 , то я понимаю
if (ErrorCode <> 0) then // если ошибка то...
if (ResultCode <> 0) then // если успех то...
а если ещё и с единицей, то не вижу разницы

вот напимер форма которая создаётся в пределах создания формы Авторана в случае работающего сервиса Steam


if (FileExists(AppPath + '\common\half-life 2\hl2.exe') or FileExists(AppPath + '\common\half-life 2 episode one\hl2.exe') or
FileExists(AppPath + '\common\half-life 2 episode two\hl2.exe') or FileExists(AppPath + '\common\portal\hl2.exe'))
and (IsProcessRunning('Steam.exe')) then

begin
MyExit := TForm.Create(nil);
with MyExit do
begin
Position := poScreenCenter;
BorderStyle := bsDialog;
ClientWidth := ScaleX(440);
ClientHeight := ScaleY(180);
Caption := ExpandConstant(SetupMessage(msgErrorTitle));
Color := clBtnFace;
DeleteMenu(GetSystemMenu(MyExit.Handle,False), $F060,0);/// сделать кнопку "закрыть" неактивной
SetClassLong(MyExit.Handle, -26, GetClassLong(MyExit.Handle, -26) or $200); /// блокировка комбинации alt + f4
SendMessage(MyExit.Handle, $0080, 0, LoadImage(0,ExpandConstant('{tmp}')+'\icon.ico',1,16,16,$1010)); /// иконка в углу
OnMouseDown := @MouseDown2;
with TBitmapImage.Create(MyExit) do
begin
Parent := MyExit;
ExtractTemporaryFile('Pic1.bmp');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\Pic1.bmp'));
SetBounds(ScaleX(0), ScaleY(0), ScaleX(440), ScaleY(120));
OnMouseDown := @MouseDown2;
end;

with TLabel.Create(MyExit) do
begin
SetBounds(ScaleX(20), ScaleY(131), ScaleX(270), ScaleY(30));
AutoSize := False;
Caption := ExpandConstant('{cm:Steam_Runs}');
Transparent := True;
WordWrap := True;
Parent := MyExit;
Font.Color := clWindowText;
//Font.Color := $48c1ca;
Font.Size := 9;
OnMouseDown := @MouseDown2;
end;

with TButton.Create(MyExit) do
begin
Caption := ExpandConstant(SetupMessage(msgButtonYes));
Parent := MyExit;
SetBounds(ScaleX(270), ScaleY(135), ScaleX(71), ScaleY(25));
ModalResult := mrYes;
end;

with TButton.Create(MyExit) do
begin
Parent := MyExit;
Caption := ExpandConstant(SetupMessage(msgButtonNo));
SetBounds(ScaleX(350), ScaleY(135), ScaleX(71), ScaleY(25));
ModalResult:= mrNo;
end;
end;

ExtractTemporaryFile('launch_deny2.wav');
sndPlaySound(ExpandConstant('{tmp}\launch_deny2.wav'),$0001);

case
MyExit.ShowModal() of

mrNo :
begin
PlayInstallButton.Enabled := not IsProcessRunning('Steam.exe');
MyExit.Free;
end;

mrYes :
begin
Exec(ExpandConstant('{reg:HKCU\Software\Valve\Steam,SteamPath|}') + '\Steam.exe', '-shutdown', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
if not (IsProcessRunning('Steam.exe')) then PlayInstallButton.Enabled := True;
MyExit.Free;
end;
end;
end;

AutoRun.ShowModal;

end;

те если вписать в
Exec(ExpandConstant('{reg:HKCU\Software\Valve\Steam,SteamPath|}') + '\Steam.exe', '-shutdown', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
ErrorCode и сравнить
if (ErrorCode = 0) then MyExit.Free else MsgBox( завршить процесс Да/Нет ...
если я правильно понимаю
(определение процесса взял отсюда http://forum.oszone.net/post-1800689-218.html)

2. достаточно ли завершить процесс так:
Exec('taskkill', '/f /im hl2.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
или лучше воспользоваться библиотекой istask.dll ?

sergey3695
04-07-2012, 11:20
El Sanchez,
А как переделать GetProcessWorkingDirectory, чтобы на юникоде работало?

El Sanchez
04-07-2012, 13:00
А как переделать GetProcessWorkingDirectory, чтобы на юникоде работало? »
Johny777, sergey3695, переделал на ansi/unicode и изменил тип результата функции - теперь возвращает не строку, а массив строк, ведь запущенных процессов с одинаковым именем может быть несколько.

1. в чём разница между ErrorCode и ResultCode »
Johny777, ни в чем, переменные можешь называть как хочешь. Код возврата ResultCode функции Exec сравнивается только с 0, ненулевой код есть код ошибки, расшифровка которого делается с помощью SysErrorMessage(ResultCode).

2. достаточно ли завершить процесс так:
Exec('taskkill', '/f /im hl2.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
или лучше воспользоваться библиотекой istask.dll ? »
Johny777, без разницы, если делают одно и то же.

L1nk3R
04-07-2012, 13:39
Привет. Насчёт taskkill (taskkill.exe) понятно - обращение идёт напрямую к исполняемому файлу. Кто подскажет, istask.dll к чему обращается? Передаёт ли библиотека обращение к исполняемому файлу или она работает внутренне непосредственно с инсталятором?
Меня интересует универсальность, если например taskkill.exe будет специально удалён из системы то библиотека отработает завершение процесса или нет?

R.i.m.s.k.y.
04-07-2012, 19:09
L1nk3R, я таскаю в инсталлере taskkill от ХР, распаковываю его в {tmp} и запускаю для убийства процесса

L1nk3R
05-07-2012, 12:01
Привет. я таскаю в инсталлере taskkill от ХР »Насчёт taskkill (taskkill.exe) понятно ».

Вообще-то меня больше интересует библиотека. По какому принципу она работает? Если она всё таки обращается к исполняемому файлу, то тогда смысла в этой библиотеке нет.

L1nk3R
05-07-2012, 16:02
Привет! Кто подскажет, как с помощью Inno вывести системные файлы из защиты виндофс а потом обратно защитить? Если такое возможно.

El Sanchez
05-07-2012, 16:11
Вообще-то меня больше интересует библиотека. По какому принципу она работает? Если она всё таки обращается к исполняемому файлу, то тогда смысла в этой библиотеке нет. »
L1nk3R, и taskkill, и taskmgr, и istask.dll вызывают функции стандартной библиотеки kernel32.dll ExitProcess (taskkill через CRT-шную функцию _exit) для корректного закрытия процесса и TerminateProcess для принудительного.

Ivan_009
05-07-2012, 16:15
Как сделать деинсталлятор в стиле инсталлятора подскажите пожалуйста :search:

Johny777
05-07-2012, 16:28
Ваня , можно подробно что именно ты хочешь?

вот есть такой пример в сообщении Winst@n
http://krinkels.org/showthread.php?t=7&page=4

такой (у меня в скрипте стоит) с выбором компонентов и скином
http://forum.oszone.net/post-1939326-314.html

Ivan_009
05-07-2012, 16:42
Johny777, типа так вот :)

FMA
05-07-2012, 17:09
Как правильно создать ярлык на папку? Сейчас использую

[Icons]
Name: {commondesktop}\Папка; Filename: {app}\Папка

но после установки и клику по ярлыку, он не срабатывает, хотя путь прописался верно.




© OSzone.net 2001-2012