Войти

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


Страниц : 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] 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

innot20
26-01-2014, 21:54
а можете подсказать как сделать проверку на процесс WorldOfTanks.exe
если процесс включен, то установить дальше не возможно, пока не выключишь игру

nik1967
26-01-2014, 22:19
innot20, шапка => Показать/скрыть: Ссылки на примеры скриптов: => Запущен ли процесс (WMI), Запущен ли процесс
Когда же вы будете сами что-то искать?

Farser21
26-01-2014, 22:26
saurn , спасибо все работает!)

Nordek
27-01-2014, 05:32
innot20,
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

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

[Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';

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

//**************************************************//
function InitializeSetup(): Boolean;
begin
If RunTask('WorldOfTanks.exe', false) then
begin
if MsgBox('Игра WorldOfTanks запущена. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('WorldOfTanks.exe');
Result:= True;
end else
Exit;
end;
Result:=True;
end;

Raf-9600
27-01-2014, 14:12
Ктонить может подсказать, как правильно через секцию [Cоde] попросить cmd.exe, чтобы он запустил определённый батник? При том чтобы консольное окно не появлялось.

Пробовал вот так:
Exec(ExpandConstant('{cmd}'), '/c start "Delete empty folders" "' + ExpandConstant('{app}\Delete empty folders.bat') + '"', ExpandConstant('{app}'), SW_HIDE, ewWaitUntilTerminated, ResultCode)
Но в таком случае окно консоли появляется и само не закрывается...

Shkutu
27-01-2014, 14:43
Raf-9600, батники можно запускать и без cmd, например так
Exec(ExpandConstant('{app}') + '\Delete empty folders.bat', '', '', SW_HIDE,
ewWaitUntilTerminated, ResultCode);
А можно из командной строки так
Exec(ExpandConstant('{cmd}'), '/C ' + ExpandConstant('{app}') + '\Delete empty folders.bat' , '', SW_HIDE, ewWaitUntilTerminated, i)
Второй способ я пользовала не для .bat, а для .cmd файлов, но по идее должно быть аналогично

diman_21Ru
27-01-2014, 14:52
делаю так чтобы удалить старые компоненты но выходит ошибка кто знает в чем проблема ?

[InstallDelete]
Type: filesandordirs; Name: "{app}\res_mods"; Check: IsChecked();

[Dirs]
Name: "{app}\res_mods"; Check: IsChecked();
Name: "{app}\res_mods\0.8.11 Common Test"; Check: IsChecked();

[code]

var
InfoPic: TBitmapImage;
LastIndex: Integer;
TempPath: String;
PicForm: TForm;
deleteChk: TCheckBox;

procedure InitializeWizard();
var
i, iCount: Integer;
begin

for i := iCount downto 0 do
WizardForm.ComponentsList.Checked[i]:= False;

deleteChk := TCheckBox.Create(nil);
with deleteChk do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0), ScaleY(115), ScaleX(400), ScaleY(15));
Caption := 'Удалить старые компоненты';
Checked := True;

function IsChecked(): Boolean;
begin
Result := deleteChk.Checked;
end;

TAY50N
27-01-2014, 14:59
TAY50N,какие строчки ты именно добавил чтобы наводя на мод выходила картинка с боку ? »[Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

const
UNDEF_INDEX = -777;
ALPHA_BLEND_LEVEL = 255; // max=Byte=255

WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
GWL_EXSTYLE = (-20);


var
InfoPic: TBitmapImage;
LastIndex: Integer;
TempPath: String;
PicForm: TForm;


type
COLORREF = DWORD;


function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external 'SetFocus@user32.dll stdcall';

//////Картинка описания//////////
procedure ShowPicHint(const PicFilePath: String);
var
pt: TPoint;
begin
if not GetCursorPos(pt) then Exit;
InfoPic.Bitmap.LoadFromFile(PicFilePath);
InfoPic.SetBounds(ScaleX(247), ScaleY(65), ScaleX(232), ScaleY(237));
InfoPic.Show;
end;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
UndefPic: String;
begin
if Index = -1 then Exit;
if Index = LastIndex then Exit;
try
case TNewCheckListBox(Sender).ItemCaption[Index] of
'Удаляем видео заставку': UndefPic := '1.bmp';
'Часы в Ангаре': UndefPic := '2.bmp';
'от zayaz': UndefPic := '3.bmp';
'от ZCH_0933': UndefPic := '4.bmp';
else
begin
LastIndex := UNDEF_INDEX;
InfoPic.Hide;
Exit;
end;
end;
if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
ShowPicHint(TempPath + UndefPic);
finally
LastIndex := Index;
end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
InfoPic.Hide;
LastIndex := -1;
end;


procedure InitInfo();
begin
WizardForm.TypesCombo.Hide;
WizardForm.ComponentsList.SetBounds(ScaleX(0), ScaleY(63), ScaleX(240), ScaleY(240));
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
TempPath := AddBackslash(ExpandConstant('{tmp}'));
LastIndex := UNDEF_INDEX;

with TBevel.Create(WizardForm) do
begin
Parent := WizardForm.SelectComponentsPage;
SetBounds(ScaleX(245), ScaleY(63), ScaleX(235), ScaleY(240));
Shape := bsFrame;
end;

InfoPic := TBitmapImage.Create(WizardForm)
with InfoPic do
begin
Parent := WizardForm.SelectComponentsPage;
AutoSize := True;
end;
end;

diman_21Ru
27-01-2014, 15:01
TAY50N ,т.е второй надо делать а не как на первом ?

saurn
27-01-2014, 15:08
делаю так чтобы удалить старые компоненты но выходит ошибка кто знает в чем проблема ? »
А ничего странного в глаза не бросается? Вот тут:
procedure InitializeWizard();
var
i, iCount: Integer;
begin

for i := iCount downto 0 do
WizardForm.ComponentsList.Checked[i]:= False;

deleteChk := TCheckBox.Create(nil);
with deleteChk do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(0), ScaleY(115), ScaleX(400), ScaleY(15));
Caption := 'Удалить старые компоненты';
Checked := True;
Здесь должны быть две логические скобки end;
function IsChecked(): Boolean;
begin
Result := deleteChk.Checked;
end;

TAY50N
27-01-2014, 15:45
diman_21Ru, вот:
http://forum.oszone.net/post-2296199-1941.html

saurn
27-01-2014, 15:53
Ему нужен этот вариант. Обрезанный, с измененным родителем изображений.[code]
const
UNDEF_INDEX = -777;


function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';


var
InfoPic: TBitmapImage;
LastIndex: Integer;
TempPath: String;


procedure ShowPicHint(const PicFilePath: String);
var
pt: TPoint;
begin
if not GetCursorPos(pt) then Exit;
InfoPic.Bitmap.LoadFromFile(PicFilePath);
InfoPic.SetBounds(ScaleX(245), ScaleY(42), ScaleX(166), ScaleY(165));
InfoPic.Show;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
UndefPic: String;
begin
if Index = -1 then Exit;
if Index = LastIndex then Exit;
try
case TNewCheckListBox(Sender).ItemCaption[Index] of
'Half-Life 2': UndefPic := 'Wasteland_Scanner_con.bmp';
'Half-Life 2 Episode One': UndefPic := 'Strider_early2.bmp';
'Half-Life 2 Episode Two': UndefPic := 'Cremator_poster.bmp';
'Portal': UndefPic := 'Portal.bmp';
else
begin
LastIndex := UNDEF_INDEX;
InfoPic.Hide;
Exit;
end;
end;
if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
ShowPicHint(TempPath + UndefPic);
finally
LastIndex := Index;
end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
InfoPic.Hide;
LastIndex := -1;
end;


procedure InitInfo();
begin
WizardForm.TypesCombo.Hide;
WizardForm.ComponentsList.SetBounds(ScaleX(0), ScaleY(37), ScaleX(225), ScaleY(176));
WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
TempPath := AddBackslash(ExpandConstant('{tmp}'));
LastIndex := UNDEF_INDEX;

with TBevel.Create(WizardForm) do
begin
Parent := WizardForm.SelectComponentsPage;
SetBounds(ScaleX(240), ScaleY(37), ScaleX(177), ScaleY(176));
Shape := bsFrame;
end;

InfoPic := TBitmapImage.Create(WizardForm)
with InfoPic do
begin
Parent := WizardForm.SelectComponentsPage;
AutoSize := True;
end;
end;


procedure InitializeWizard();
begin
InitInfo();
end;Хотя, если посмотреть сколько раз вопрос на эту тему был задан, и сколько раз на него ответили...

diman_21Ru
27-01-2014, 16:00
TAY50N , у меня она выходит на середину как бы мне можно тут все поменять т.к расширить низ верх и сделать попопам как тут ?

saurn
27-01-2014, 16:01
у меня она выходит на середину как бы мне можно тут все поменять т.к расширить низ верх и сделать попопам как тут ? »
Я код постом выше для кого выложил?

diman_21Ru
27-01-2014, 16:07
saurn ,ошибка выходит с deleteChk .

saurn
27-01-2014, 16:12
ошибка выходит с deleteChk »
Жуть. Давайте свой скрипт с минимальным набором файлов

diman_21Ru
27-01-2014, 16:16
saurn =) http://rghost.ru/51965901 вот убрал deleteChk это чтобы не было ошибки

innot20
27-01-2014, 16:48
Код:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
[Files]
Source: ISTask.dll; DestDir: {app}; Flags: dontcopy
[Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
//**************************************************//
function InitializeSetup(): Boolean;
begin
If RunTask('WorldOfTanks.exe', false) then
begin
if MsgBox('Игра WorldOfTanks запущена. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('WorldOfTanks.exe');
Result:= True;
end else
Exit;
end;
Result:=True;
end; »

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

saurn
27-01-2014, 17:06
diman_21Ru, скрипт во вложении.

Shkutu
27-01-2014, 17:58
пока не выключишь процесс »
В смысле, чтоб процесс пользователю руками выключать надо было?
Попробуй так

[code]
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;

var Page:TOutputMsgWizardPage;

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; //FileName - имя exe-файла процесса
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;


procedure InitializeWizard;
begin
Page:=CreateOutputMsgPage(wpSelectComponents, "Внимание", "Игра WorldOfTanks запущена", "Игра WorldOfTanks запущена. Закройте, чтобы продолжить установку");
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
if (CurPageID= Page.id) then
begin
if IsProcessRunning('WorldOfTanks.exe') then
result:=false
else
result:=true;
end
else
result:=true;
end;




© OSzone.net 2001-2012