Скрипты Inno Setup. Помощь и советы [часть 5]
-
JHeavy
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
Здравствуйте, подскажите как сделать чтобы в списке компонентов (чекбоксы) можно было выбрать только один из компонентов?
-
R.i.m.s.k.y.
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
Доброго времени суток! Как сделать такой серийный номер, который будет зависеть от каких-либо параметров компьютера?
Идея в том, чтобы клиент скидывал мне серийный номер, а я ему отправлял правильный пароль.
есть функция (взята из справки, как просто вводить определенный серийный номер), например по маске:
function CheckSerial(Serial: String): Boolean;
var
mask:string;
i:Integer;
begin
Result:=True;
mask:='####-####-##****';
If Length(Serial)Length(mask) then
begin
Result:=False;
exit;
end;
For i:=1 to Length(mask) do
begin
If StrGet(mask, i)='#' then
If not ((Ord(StrGet(Serial, i))>=48) and (Ord(StrGet(Serial, i))='A') and (StrGet(Serial, i)
Идея в том, чтобы клиент скидывал мне серийный номер, а я ему отправлял правильный пароль.
есть функция (взята из справки, как просто вводить определенный серийный номер), например по маске:
function CheckSerial(Serial: String): Boolean;
var
mask:string;
i:Integer;
begin
Result:=True;
mask:='####-####-##****';
If Length(Serial)Length(mask) then
begin
Result:=False;
exit;
end;
For i:=1 to Length(mask) do
begin
If StrGet(mask, i)='#' then
If not ((Ord(StrGet(Serial, i))>=48) and (Ord(StrGet(Serial, i))='A') and (StrGet(Serial, i)
-
R.i.m.s.k.y.
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
RodionSabitov, думаю твой случай WinApi функция
ID текущего процесса.
ID текущей нити исполнения.
Число тактов с момента последней загрузки.
Текущее время.
Различные высокоточные счётчики.
Хэш-функции MD4 от персональных данных пользователя, таких как логин, имя компьютера, и др.
Высокоточные внутрипроцессорные счётчиков, таких как RDTSC, RDMSR, RDPMC.
...
только портировать сей код
=====================================================================
помню спрашивал
на определение рабочей папки процесса, после чего я убивал процесс через ком строку Exec('taskkill', '/f /im hl2.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
но вот 2 проблемы
1: как узнать, что процесс убит? Можно после команды консоли проверть есть ли этот процесс, но как-то это не очень удобно!
2: Запущено 5 одинаковых процессов из разных директорий, а нужно убить только 1 нли 2 из них, но не все (не мой случай), но всё-таки
...
намутил код на основе
ключевая функция function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
Убиение процесса function KillTaskEx(ExeFileName: String): Boolean;
функция возвращает булев значение (убила, не убила процесс)
входным параметром может быть:
1. Имя процесса - будут завершаться все процессы с этим именем ...if KillTaskEx('calc.exe') then MsgBox('OK', mbInformation, MB_OK);
2. Путь к файлу от которого исходит процесс (рабочая директория) ...if KillTaskEx('C:\calc.exe') then MsgBox('OK', mbInformation, MB_OK);
во втором случае завершится процесс/процессы только из этой директории!
забирайте кому нужно код:
Код:
http://ru.wikipedia.org/wiki/CryptGenRandom
которая выдаёт число собранное изчитать дальше »
ID текущего процесса.
ID текущей нити исполнения.
Число тактов с момента последней загрузки.
Текущее время.
Различные высокоточные счётчики.
Хэш-функции MD4 от персональных данных пользователя, таких как логин, имя компьютера, и др.
Высокоточные внутрипроцессорные счётчиков, таких как RDTSC, RDMSR, RDPMC.
...
только портировать сей код
http://www.sql.ru/forum/actualthread.aspx?tid=467265
для меня не намного легче чем из моего предыдущего поста 
=====================================================================
помню спрашивал
Скрипты Inno Setup. Помощь и советы [часть 5]
и El Sanchez дал классный код Скрипты Inno Setup. Помощь и советы [часть 5]
на определение рабочей папки процесса, после чего я убивал процесс через ком строку Exec('taskkill', '/f /im hl2.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
но вот 2 проблемы
1: как узнать, что процесс убит? Можно после команды консоли проверть есть ли этот процесс, но как-то это не очень удобно!
2: Запущено 5 одинаковых процессов из разных директорий, а нужно убить только 1 нли 2 из них, но не все (не мой случай), но всё-таки
...намутил код на основе
Скрипты Inno Setup. Помощь и советы [часть 5]
под свои нуждыключевая функция function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
Убиение процесса function KillTaskEx(ExeFileName: String): Boolean;
функция возвращает булев значение (убила, не убила процесс)
входным параметром может быть:
1. Имя процесса - будут завершаться все процессы с этим именем ...if KillTaskEx('calc.exe') then MsgBox('OK', mbInformation, MB_OK);
2. Путь к файлу от которого исходит процесс (рабочая директория) ...if KillTaskEx('C:\calc.exe') then MsgBox('OK', mbInformation, MB_OK);
во втором случае завершится процесс/процессы только из этой директории!
забирайте кому нужно код:
читать дальше »
Код:
Код: Выделить всё
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[code]
const
TH32CS_SNAPPROCESS = $2;
INVALID_HANDLE_VALUE = -1;
PROCESS_QUERY_INFORMATION = $400;
PROCESS_VM_READ = $10;
MAX_PATH = 260;
PROCESS_TERMINATE = $0001;
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 GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameExA@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function CharArrayToString(cArray: array of Char): String;
begin
Result := '';
while cArray[Length(Result)] #0 do Insert(cArray[Length(Result)], Result, Length(Result)+1);
end;
function KillTaskEx(ExeFileName: String): Boolean;
var
ContinueLoop: BOOL;
hProcessSnap, hProc: THandle;
pe32: TPROCESSENTRY32;
szExeFile: array [0..MAX_PATH-1] of Char;
begin
hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
pe32.dwSize := SizeOf(pe32);
ContinueLoop := Process32First(hProcessSnap, pe32);
while ContinueLoop do
begin
if ExtractFilePath(ExeFileName) '' then
begin
hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pe32.th32ProcessID);
if GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH) > 0 then
if CompareText(CharArrayToString(szExeFile), ExeFileName) = 0 then
Result := TerminateProcess(OpenProcess(PROCESS_TERMINATE, False, pe32.th32ProcessID), 0);
CloseHandle(hProc);
end else
if ExtractFilePath(ExeFileName) = '' then
if (UpperCase(CharArrayToString(pe32.szExeFile)) = UpperCase(ExeFileName)) then
Result := TerminateProcess(OpenProcess(PROCESS_TERMINATE, False, pe32.th32ProcessID), 0);
ContinueLoop := Process32Next(hProcessSnap, pe32);
end;
CloseHandle(hProcessSnap);
end;
procedure InitializeWizard();
var
ErrorCode, i: Integer;
begin
if FileCopy(ExpandConstant('{sys}\calc.exe'), 'C:\calc.exe', False) then
begin
MsgBox('для демонстрации скопирован калькулятор в C:\calc.exe', mbInformation, MB_OK);
for i := 0 to 3 do Exec(ExpandConstant('C:\calc.exe'), '', '', SW_SHOW, ewNoWait, ErrorCode);
for i := 0 to 7 do Exec(ExpandConstant('calc.exe'), '', '', SW_SHOW, ewNoWait, ErrorCode);
MsgBox('запущено 4 калькулятора из C:\ и 8 из папки винды', mbInformation, MB_OK);
if KillTaskEx('C:\calc.exe') then MsgBox('убито 4 калькулятора из C:\', mbInformation, MB_OK);
if KillTaskEx('calc.exe') then MsgBox('убиты все остальные', mbInformation, MB_OK);
end;
end;-
al70
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
Johny777, TerminateProcess стоит применять в крайнем случае, когда другие способы завершения процесса не помогают. Нужно послать окну программы сообщение WM_CLOSE, подождать 5 сек (где-то читал, что приложение считается зависшим, если не отвечает на действия системы в течение 5 сек.) и только потом TerminateProcess, если нужно.
Код:
читать дальше »
Код:
Код: Выделить всё
const
TH32CS_SNAPPROCESS = $2;
INVALID_HANDLE_VALUE = -1;
WM_CLOSE = $10;
WAIT_OBJECT_0 = $0;
TA_FAILED = 0;
TA_SUCCESS_CLEAN = 1;
TA_SUCCESS_KILL = 2;
SYNCHRONIZE = $100000;
PROCESS_TERMINATE = $1;
type
TPROCESSENTRY32 = record
dwSize, cntUsage, th32ProcessID: DWORD;
th32DefaultHeapID: Longint;
th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
pcPriClassBase: Longint;
dwFlags: DWORD;
szExeFile: array [0..MAX_PATH-1] 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 OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function GetWindowThreadProcessId(hWnd: HWND; var lpdwProcessId: DWORD): DWORD; external 'GetWindowThreadProcessId@user32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function CharArrayToString(aChar: array of Char): String;
begin
Result := '';
while aChar[Length(Result)] #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;
function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
var
dwID: DWORD;
begin
GetWindowThreadProcessId(hwnd, dwID) ;
if dwID = lParam then PostMessage(hwnd, WM_CLOSE, 0, 0);
Result := True;
end;
function TerminateApp(const ProcessName: String; dwTimeout: DWORD): DWORD;
var
hProcessSnap, hProc: THandle;
pe32: TPROCESSENTRY32;
begin
hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
try
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(SYNCHRONIZE or PROCESS_TERMINATE, False, pe32.th32ProcessID);
if hProc = TA_FAILED then Exit;
try
EnumWindows(CallbackAddr('EnumWindowsProc'), pe32.th32ProcessID);
if WaitForSingleObject(hProc, dwTimeout) = WAIT_OBJECT_0 then
Result := TA_SUCCESS_CLEAN
else if TerminateProcess(hProc, 0) then Result := TA_SUCCESS_KILL else Result := TA_FAILED;
finally
CloseHandle(hProc);
end;
end;
end;
finally
CloseHandle(hProcessSnap);
end;
end;
procedure InitializeWizard();
begin
TerminateApp('calc.exe', 5000);
end;-
Johny777
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
Цитата El Sanchez:
где-то читал, что приложение считается зависшим, если не отвечает на действия системы в течение 5 сек.
в реестре наверное
HKCU\Control Panel\Desktop
"HungAppTimeout"="5000"
так что ждать нужно не 5сек, а значение параметра HungAppTimeout
где-то читал, что приложение считается зависшим, если не отвечает на действия системы в течение 5 сек.
Скрипты Inno Setup. Помощь и советы [часть 5]
в реестре наверное
HKCU\Control Panel\Desktop
"HungAppTimeout"="5000"
так что ждать нужно не 5сек, а значение параметра HungAppTimeout
-
pritoreanic
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
Цитата R.i.m.s.k.y.:
значение параметра HungAppTimeout
вероятнее всего это 5000 миллисекунд = 5 секунд, ваш Кэп.
==========================================================
El Sanchez, Ты можешь пожалуйста научить свою функцию так чтоб она ещё и путь к файлу сравнивала как у меня, ну короче чтоб при необходимости только определённые процессы завершать.
(а то получается грохнули одного Васю, другого, а фамилию не спросили)
Я боюсь это делать, тк когда свою функцию ваял мне показали 2 раза синий экран, и сейчс ещё раз когда твою функцию дополнял
Цитата El Sanchez:
TerminateProcess стоит применять в крайнем случае, когда другие способы завершения процесса не помогают
не знал, но ради интереса поискал другие более гуманные способы, других не нашёл. Ну кроме закрытия окна программы:
Цитата El Sanchez:
Нужно послать окну программы сообщение WM_CLOSE
гуманных не нашёл, но наткнулся на более зверский:
хотя там тоже TerminateProcess, но уже для системных процессов, путём поднятия привилегий текущему процессу, как я понимаю
пртировал, не тестил (боюсь)
Код:
PS: Халфе 2 в полноэкранном режиме на сообщение PostMessage(hwnd, WM_CLOSE, 0, 0); пофиг, (поставлю dwTimeout в 2 раза меньше)
но в оконном режиме, закрытие окна работает на ура
значение параметра HungAppTimeout
Скрипты Inno Setup. Помощь и советы [часть 5]
вероятнее всего это 5000 миллисекунд = 5 секунд, ваш Кэп.
==========================================================
El Sanchez, Ты можешь пожалуйста научить свою функцию так чтоб она ещё и путь к файлу сравнивала как у меня, ну короче чтоб при необходимости только определённые процессы завершать.
(а то получается грохнули одного Васю, другого, а фамилию не спросили)
Я боюсь это делать, тк когда свою функцию ваял мне показали 2 раза синий экран, и сейчс ещё раз когда твою функцию дополнял
Цитата El Sanchez:
TerminateProcess стоит применять в крайнем случае, когда другие способы завершения процесса не помогают
Скрипты Inno Setup. Помощь и советы [часть 5]
не знал, но ради интереса поискал другие более гуманные способы, других не нашёл. Ну кроме закрытия окна программы:
Цитата El Sanchez:
Нужно послать окну программы сообщение WM_CLOSE
Скрипты Inno Setup. Помощь и советы [часть 5]
гуманных не нашёл, но наткнулся на более зверский:
http://www.delphisources.ru/forum/sh...ad.php?t=21276
хотя там тоже TerminateProcess, но уже для системных процессов, путём поднятия привилегий текущему процессу, как я понимаю
пртировал, не тестил (боюсь)
читать дальше »
Код:
Код: Выделить всё
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[noparse][code][/npparse]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
TOKEN_ADJUST_PRIVILEGES = $32;
TOKEN_QUERY = $8;
SE_PRIVILEGE_ENABLED = $2;
ERROR_SUCCESS = 0;
TH32CS_SNAPPROCESS = $2;
INVALID_HANDLE_VALUE = -1;
WM_CLOSE = $10;
WAIT_OBJECT_0 = $0;
TA_FAILED = 0;
SYNCHRONIZE = $100000;
PROCESS_TERMINATE = $1;
MAX_PATH = 260;
type
_ULARGE_INTEGER = record
LowPart: DWORD;
HighPart: DWORD;
end;
_LUID_AND_ATTRIBUTES = record
Luid: _ULARGE_INTEGER;
Attributes: DWORD;
end;
_TOKEN_PRIVILEGES = record
PrivilegeCount: DWORD;
Privileges: array[0..0] of _LUID_AND_ATTRIBUTES;
end;
TPROCESSENTRY32 = record
dwSize, cntUsage, th32ProcessID: DWORD;
th32DefaultHeapID: Longint;
th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
pcPriClassBase: Longint;
dwFlags: DWORD;
szExeFile: array [0..MAX_PATH-1] 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 OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function GetCurrentProcess: THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: _ULARGE_INTEGER): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; const NewState: _TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: _TOKEN_PRIVILEGES; var ReturnLength: DWORD): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetLastError: DWORD; external 'GetLastError@kernel32.dll stdcall';
function GetWindowThreadProcessId(hWnd: HWND; var lpdwProcessId: DWORD): DWORD; external 'GetWindowThreadProcessId@user32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
function CharArrayToString(aChar: array of Char): String;
begin
Result := '';
while aChar[Length(Result)] #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;
function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
var
dwID: DWORD;
begin
GetWindowThreadProcessId(hwnd, dwID) ;
if dwID = lParam then PostMessage(hwnd, WM_CLOSE, 0, 0);
Result := True;
end;
function ProcessTerminate(const ProcessName: String; dwTimeout: DWORD):Boolean;
var
hToken: THandle;
SeDebugNameValue: _ULARGE_INTEGER;
tkp: _TOKEN_PRIVILEGES;
ReturnLength: Cardinal;
hProcess: THandle;
pe32: TPROCESSENTRY32;
hProcessSnap: THandle;
begin
Result := False;
// Добавляем привилегию SeDebugPrivilege
// Для начала получаем токен нашего процесса
if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
// Получаем LUID привилегии
if not LookupPrivilegeValue('', 'SeDebugPrivilege', SeDebugNameValue) then
begin
CloseHandle(hToken);
Exit;
end;
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Luid := SeDebugNameValue;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
// Добавляем привилегию к нашему процессу
AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ReturnLength);
if GetLastError() ERROR_SUCCESS then exit;
// Завершаем процесс. Если у нас есть SeDebugPrivilege, то мы можем
// завершить и системный процесс
// Получаем дескриптор процесса для его завершения
hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
try
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
hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, pe32.th32ProcessID);
if hProcess = TA_FAILED then Exit;
try
Result := WaitForSingleObject(hProcess, dwTimeout) = WAIT_OBJECT_0;
if not Result then Result := TerminateProcess(hProcess, 0);
finally
CloseHandle(hProcess);
end;
end;
end;
finally
CloseHandle(hProcessSnap);
end;
// Удаляем привилегию
tkp.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);
if GetLastError() ERROR_SUCCESS then Exit;
Result := True;
end;
procedure InitializeWizard();
begin
ProcessTerminate('calc.exe', 5000);
end;PS: Халфе 2 в полноэкранном режиме на сообщение PostMessage(hwnd, WM_CLOSE, 0, 0); пофиг, (поставлю dwTimeout в 2 раза меньше)
но в оконном режиме, закрытие окна работает на ура
-
InnoQuest
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
Цитата Johny777:
гуманных не нашёл,
по сути WM_CLOSE единственный верный способ закрытия приложения. Привилегии нужны только для работы с системными процессами, поэтому не стоит. антивирь с привилегиями не убьешь, если это нормальный антивирь, а вот систему - запросто. да и в инно давно уже это есть на автомате. правда для систем выше ХР, но тенденция такова, что ХР поддерживает все меньше и меньше приложений.
гуманных не нашёл,
Скрипты Inno Setup. Помощь и советы [часть 5]
по сути WM_CLOSE единственный верный способ закрытия приложения. Привилегии нужны только для работы с системными процессами, поэтому не стоит. антивирь с привилегиями не убьешь, если это нормальный антивирь, а вот систему - запросто. да и в инно давно уже это есть на автомате. правда для систем выше ХР, но тенденция такова, что ХР поддерживает все меньше и меньше приложений.
-
R.i.m.s.k.y.
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
InnoQuest, а ответ один - добавлять к строчкам параметр Components: 1 2 3
1.
Код:
2.
Код:
3. не надо было ставить флаг nowait, вот установщик и nowait. Флаг postinstall формирует галочку на последней странице установщика с описанием Description
Код:
1.
Код:
Код: Выделить всё
[Files]
Components:KMBD; Source: "C:\Users\NIC\Desktop\Install\res\KMBD1311\*"; DestDir: "{app}"; Components: KMBD; Flags: ignoreversion recursesubdirs createallsubdirs
[Icons]
Components:KMBD; Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"2.
Код:
Код: Выделить всё
[Tasks]
Components: MAP and not (KMBD and Framework); Name: desktopicon; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Components: MAP and not (KMBD and Framework); Name: quicklaunchicon; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Tasks: desktopicon; Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}";
Tasks: quicklaunchicon; Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}";3. не надо было ставить флаг nowait, вот установщик и nowait. Флаг postinstall формирует галочку на последней странице установщика с описанием Description
Код:
Код: Выделить всё
[Run]
Components: KMBD; Filename: "{app}\RunApp\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: postinstall skipifsilent
Components: Framework; Filename: "{app}\.NET Framework 4.0\{#MyFrameWorkName}"; Description: "{cm:LaunchProgram,{#MyFrameWorkName}}"; Flags: skipifsilent-
Johny777
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
pritoreanic, пардон за недоработку. Исправил!
Код:
и убирай пожалуйста крупные коды и скрины под спойлер!
читать дальше »
Код:
Код: Выделить всё
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[CustomMessages]
russian.Desc=Описание:
russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание.
russian.ComponentsDescription1=Minecraft 1.4.5
russian.ComponentsDescription2=1.
russian.ComponentsDescription3=12.
russian.ComponentsDescription4=123.
russian.ComponentsDescription5=1234.
russian.ComponentsDescription6=12345.
russian.ComponentsDescription7=123456.
russian.ComponentsDescription8=1234567.
russian.ComponentsDescription9=12345678.
russian.ComponentsDescription10=123456789.
russian.ComponentsDescription11=SMP-123.
[Components]
Name: main; Description: Minecraft; Flags: fixed; Types: custom compact full
Name: c\1; Description: rus; Flags: exclusive
Name: c\2; Description: eng; Flags: exclusive
Name: Component1; Description: kom;
Name: c\1; Description: AudioMod; Flags: fixed; Types: custom compact full
Name: c\2; Description: ModLoader; Flags: fixed; Types: custom compact full
Name: c\3; Description: Optifine;
Name: c\4; Description: TooManyItem;
Name: c\5; Description: Rei's Minimap;
Name: Component2; Description: s;
Name: c\1; Description: SMP-s;
[Files]
Source: "C:\InstallFiles\main\Minecraft.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: C:\InstallFiles\main\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: main
Source: C:\InstallFiles\comp1\*; DestDir: {app}; Flags: ignoreversion; Components: Component1
Source: C:\InstallFiles\comp2\*; DestDir: {app}; Flags: ignoreversion; Components: Component2
[code]
var
DescRTV: TRichEditViewer;
procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;
procedure InitializeWizard;
begin
with WizardForm do
begin
ComponentsList.SetBounds(ScaleX(0), SelectComponentsLabel.Top + SelectComponentsLabel.Height + ScaleY(5), (SelectComponentsPage.Width - ScaleX(5)) div 2, ScaleY(165));
ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;
TypesCombo.Hide;
DescRTV := TRichEditViewer.Create(nil)
with DescRTV do
begin
Parent := SelectComponentsPage;
SetBounds(ComponentsList.Left + ComponentsList.Width + ScaleX(5), ComponentsList.Top, ComponentsList.Width, ComponentsList.Height);
ReadOnly := True;
ScrollBars := ssVertical;
Color := clBtnFace;
RTFText := CustomMessage('ComponentsDescription0');
end;
end;
end;и убирай пожалуйста крупные коды и скрины под спойлер!
-
InnoQuest
Re: Скрипты Inno Setup. Помощь и советы [часть 5]
вот полный скрипт на лого
Код:
вот полный скрипт на wizardsmallimage
Код:
для работы лого должа быть установленна расширенная версия от Restools т.е Inno Setup Ultra
Цитата Gnom_aka_Lexander:
Код:
огромное спасибо!!!!только вместо точки на конце end. нужно было вставить ; точку с запятой
и как сделать растяжение wizardsmallimage на деинсталляторе с сокрытием лейбелов?
Код:
Код: Выделить всё
[Setup]
BitmapResource=logo:logo.bmp
[Files]
Source: logo.bmp; DestDir: {app}; Flags: dontcopy
[*Code]
procedure InitializeUninstallProgressForm();
begin
with TBitmapImage.Create(nil) do
begin
Parent := UninstallProgressForm;
Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
Stretch:= true;
SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
end;
end;вот полный скрипт на wizardsmallimage
Код:
Код: Выделить всё
[Setup]
WizardSmallImageFile={tmp}\WizardSmallImage.bmp
[Files]
Source: {tmp}\WizardSmallImage.bmp; DestDir: {app}; Flags: ignoreversion; Attribs: Hidden;
[*Code]
procedure InitializeUninstallProgressForm();
begin
FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{app}\WizardSmallImage.bmp'), False);
with UninstallProgressForm.WizardSmallBitmapImage do
begin
Bitmap.LoadFromFile(ExpandConstant('{app}\WizardSmallImage.bmp'));
end;
end;для работы лого должа быть установленна расширенная версия от Restools т.е Inno Setup Ultra
Цитата Gnom_aka_Lexander:
Код:
Код: Выделить всё
procedure InitializeUninstallProgressForm();
begin
FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{app}\WizardSmallImage.bmp'), False);
with UninstallProgressForm.WizardSmallBitmapImage do
Bitmap.LoadFromFile(ExpandConstant('{app}\WizardSmallImage.bmp'));
with TBitmapImage.Create(UninstallProgressForm) do
begin
Parent := UninstallProgressForm;
Stretch:= true;
SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
end;
end.Скрипты Inno Setup. Помощь и советы [часть 5]
огромное спасибо!!!!только вместо точки на конце end. нужно было вставить ; точку с запятой
и как сделать растяжение wizardsmallimage на деинсталляторе с сокрытием лейбелов?