Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
Johny777
30-11-2012, 01:04
Пацаны, помогите пожалуйста создать настоящий генератор случайных чисел!
дело в том, что функция random основана на математике, а потому числа которые она возвращает не хаотичны, много повторов подряд
перевернул форумы и понял, что единственный способ получить настоящее случайное число описан здесь http://habrahabr.ru/post/62237/
за исключением получения их из квантового вакуума http://www.lenta.ru/news/2012/04/16/randomiser/ :)
а именно "запись помех электропитания" звуковой карты в буфер, считывание оттуда значения
грубо говоря мне нужен "более рандомный рандом"
в общем импортировал из MMSystem.pas функции и структуры данных, и перевернул форумы по записи с микофона и вообще записи, но сложновато
прошу помочь по возможности!
код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
[ Code]
const
WAVE_FORMAT_PCM = 1;
type
tWAVEFORMATEX = record
wFormatTag: Word; { format type }
nChannels: Word; { number of channels (i.e. mono, stereo, etc.) }
nSamplesPerSec: DWORD; { sample rate }
nAvgBytesPerSec: DWORD; { for buffer estimation }
nBlockAlign: Word; { block size of data }
wBitsPerSample: Word; { number of bits per sample of mono data }
cbSize: Word; { the count in bytes of the size of }
end;
wavehdr_tag = record
lpData: PAnsiChar; { pointer to locked data buffer }
dwBufferLength: DWORD; { length of data buffer }
dwBytesRecorded: DWORD; { used for input only }
dwUser: DWORD; { for client's use }
dwFlags: DWORD; { assorted flags (see defines) }
dwLoops: DWORD; { loop control counter }
lpNext: Integer; { reserved for driver }
reserved: DWORD; { reserved for driver }
end;
function waveInOpen(lphWaveIn: Integer; uDeviceID: UINT; lpFormatEx: tWAVEFORMATEX; dwCallback, dwInstance, dwFlags: DWORD): UINT; external 'waveInOpen@winmm.dll stdcall';
function waveInPrepareHeader(hWaveIn: Integer; lpWaveInHdr: wavehdr_tag; uSize: UINT): UINT; external 'waveInPrepareHeader@winmm.dll stdcall';
function waveInAddBuffer(hWaveIn: Integer; lpWaveInHdr: wavehdr_tag; uSize: UINT): UINT; external 'waveInAddBuffer@winmm.dll stdcall';
function waveInUnprepareHeader(hWaveIn: Integer; lpWaveInHdr: wavehdr_tag; uSize: UINT): UINT; external 'waveInUnprepareHeader@winmm.dll stdcall';
function waveInClose(hWaveIn: Integer): UINT; external 'waveInClose@winmm.dll stdcall';
function waveInStart(hWaveIn: Integer): UINT; external 'waveInStart@winmm.dll stdcall';
function waveInReset(hWaveIn: Integer): UINT; external 'waveInReset@winmm.dll stdcall';
function waveInStop(hWaveIn: Integer): UINT; external 'waveInStop@winmm.dll stdcall';
procedure InitializeWizard;
var
Noise : tWAVEFORMATEX;
begin
Noise.wFormatTag := WAVE_FORMAT_PCM;
Noise.nChannels := 1;
Noise.wBitsPerSample := 16;
Noise.nSamplesPerSec := 11025;//
Noise.cbSize:=Noise.wBitsPerSample div 8 * Noise.nChannels;
Noise.nAvgBytesPerSec:=Noise.nSamplesPerSec * Noise.nBlockAlign;
Noise.cbSize:=0;
end;
PS: извините, что выношу вам мозг своими злостными потребностями :blush:
RodionSabitov
30-11-2012, 11:57
Доброго времени суток! Как сделать такой серийный номер, который будет зависеть от каких-либо параметров компьютера?
Идея в том, чтобы клиент скидывал мне серийный номер, а я ему отправлял правильный пароль.
есть функция (взята из справки, как просто вводить определенный серийный номер), например по маске:
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))<=57)) then
begin
Result:=False;
exit;
end;
If StrGet(mask, i)='*' then
If not ((StrGet(Serial, i)>='A') and (StrGet(Serial, i)<='Z')) then
begin
Result:=False;
exit;
end;
end;
end;
Johny777
01-12-2012, 16:41
RodionSabitov, думаю твой случай WinApi функция http://ru.wikipedia.org/wiki/CryptGenRandom которая выдаёт число собранное из
ID текущего процесса.
ID текущей нити исполнения.
Число тактов с момента последней загрузки.
Текущее время.
Различные высокоточные счётчики.
Хэш-функции MD4 от персональных данных пользователя, таких как логин, имя компьютера, и др.
Высокоточные внутрипроцессорные счётчиков, таких как RDTSC, RDMSR, RDPMC.
...
только портировать сей код http://www.sql.ru/forum/actualthread.aspx?tid=467265 для меня не намного легче чем из моего предыдущего поста :(
=====================================================================
помню спрашивал http://forum.oszone.net/post-1945197-379.html и El Sanchez дал классный код http://forum.oszone.net/post-1945281-380.html
на определение рабочей папки процесса, после чего я убивал процесс через ком строку Exec('taskkill', '/f /im hl2.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
но вот 2 проблемы
1: как узнать, что процесс убит? Можно после команды консоли проверть есть ли этот процесс, но как-то это не очень удобно!
2: Запущено 5 одинаковых процессов из разных директорий, а нужно убить только 1 нли 2 из них, но не все (не мой случай), но всё-таки :)...
намутил код на основе http://forum.oszone.net/post-1945281-380.html под свои нужды
ключевая функция 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;
El Sanchez
01-12-2012, 17:54
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;
R.i.m.s.k.y.
01-12-2012, 18:30
где-то читал, что приложение считается зависшим, если не отвечает на действия системы в течение 5 сек. »
в реестре наверное
HKCU\Control Panel\Desktop
"HungAppTimeout"="5000"
так что ждать нужно не 5сек, а значение параметра HungAppTimeout
Johny777
02-12-2012, 03:33
значение параметра HungAppTimeout »
вероятнее всего это 5000 миллисекунд = 5 секунд, ваш Кэп.
==========================================================
El Sanchez, Ты можешь пожалуйста научить свою функцию так чтоб она ещё и путь к файлу сравнивала как у меня, ну короче чтоб при необходимости только определённые процессы завершать.
(а то получается грохнули одного Васю, другого, а фамилию не спросили)
Я боюсь это делать, тк когда свою функцию ваял мне показали 2 раза синий экран, и сейчс ещё раз когда твою функцию дополнял :)
TerminateProcess стоит применять в крайнем случае, когда другие способы завершения процесса не помогают »
не знал, но ради интереса поискал другие более гуманные способы, других не нашёл. Ну кроме закрытия окна программы:
Нужно послать окну программы сообщение WM_CLOSE »
гуманных не нашёл, но наткнулся на более зверский: :)
http://www.delphisources.ru/forum/showthread.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 раза меньше)
но в оконном режиме, закрытие окна работает на ура
Gnom_aka_Lexander
02-12-2012, 13:37
гуманных не нашёл, »
по сути WM_CLOSE единственный верный способ закрытия приложения. Привилегии нужны только для работы с системными процессами, поэтому не стоит. антивирь с привилегиями не убьешь, если это нормальный антивирь, а вот систему - запросто. да и в инно давно уже это есть на автомате. правда для систем выше ХР, но тенденция такова, что ХР поддерживает все меньше и меньше приложений.
habib2302
04-12-2012, 11:28
Люди.помогите мне объеденить эти два кода и чтобы они работали одновременно.Здесь один код на работу wizardsmallimage во время удаления и код на работу кликабельного лого во время удаления.Но если их поменять местами допустим код на лого сверху,а на wizardsmallimage внизу.
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;
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 нет.
http://i49.fastpic.ru/big/2012/1204/6c/75d7bae7abcd6f11a228aab14bdaea6c.png (http://i50.fastpic.ru/big/2012/1204/8d/3adb42ab4579e5c53e0067e959b42f8d.png) http://i50.fastpic.ru/big/2012/1204/f0/3dfe345ffb27855ff43f0e1d3310eef0.png (http://i50.fastpic.ru/big/2012/1204/59/2419a7dece01ded6b22a1ed7087a5c59.png)
вот коды
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;
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;
Gnom_aka_Lexander
04-12-2012, 12:20
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. и плюнь в лицо тому, кто учил тебя ТАК объединять код.
habib2302
04-12-2012, 12:28
вот полный скрипт на лого
[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
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. »
огромное спасибо!!!!только вместо точки на конце end. нужно было вставить ; точку с запятой
и как сделать растяжение wizardsmallimage на деинсталляторе с сокрытием лейбелов?
Gnom_aka_Lexander
04-12-2012, 14:28
с сокрытием лейбелов? »
вот все элементы окна деинсталлятора:
TUninstallProgressForm = class(TSetupForm)
property OuterNotebook: TNewNotebook; read;
property InnerPage: TNewNotebookPage; read;
property InnerNotebook: TNewNotebook; read;
property InstallingPage: TNewNotebookPage; read;
property MainPanel: TPanel; read;
property PageNameLabel: TNewStaticText; read;
property PageDescriptionLabel: TNewStaticText; read;
property WizardSmallBitmapImage: TBitmapImage; read;
property Bevel1: TBevel; read;
property StatusLabel: TNewStaticText; read;
property ProgressBar: TNewProgressBar; read;
property BeveledLabel: TNewStaticText; read;
property Bevel: TBevel; read;
property CancelButton: TNewButton; read;
end;
Не нашел ни одного лейбела.т.е Inno Setup Ultra »
и не нужно рекламировать. Во первых моя сборка в рекламе не нуждается, во вторых тут и наказать могут.
habib2302
04-12-2012, 16:49
как сделать инсталлятор без версии т.е убрать версию? #define MyAppVersion "1.0.03"
[Setu]
AppVersion={#MyAppVersion}
R.i.m.s.k.y.
04-12-2012, 16:56
habib2302, какой лаконичный скрипт
наверное нужно удалить строчки где встречается MyAppVersion
В общем в секции [Setup] за номер версии отвечают VersionInfoVersion, VersionInfoCompany, VersionInfoDescription, VersionInfoTextVersion
Во первых моя сборка в рекламе не нуждается, во вторых тут и наказать могут. »
да ладно. Пока в инно все феньки по ссылкам соберешь - весь моск сморщишь. А так все в одном месте только спинным мозгом Далее дави и все фишки свалятся на диск.
Зер гут.
SoulSide
04-12-2012, 17:26
как сделать инсталлятор без версии т.е убрать версию? »
AppName без AppVersion не пропустит, но директиву AppVersion можно заменить на AppVerName, таким образом если хотите чтоб в журнале деинсталляции записалось совсем без версии а только название, то директиву AppVersion нужно заменить на AppVerName.
#define MyAppName "Моя программа"
[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
habib2302
04-12-2012, 18:07
SoftLine
огромное спасибо!!!
RedBishep
06-12-2012, 02:41
Доброго времени суток.
Нужен пример скрипта....
У меня несколько архивов 7z, мне нужно для каждого архива отдельный прогресс бар в Inno ( Прогресс бар Внутри программы а не снаружи)
Или если можно подскажите как сделать такое в редакторе форм.
Заранее благодарен.
Надеюсь объяснил внятно =)
Johny777
06-12-2012, 03:32
RedBishep, читай страницы 123-125 включительно
RedBishep
06-12-2012, 05:28
Johny777
Спасибки вроде в поиске писал он нечего такого не нашел =))
SoulSide
06-12-2012, 08:58
Johny777, Поправочка: По умолчанию да, страницы 123-125 есть,но например на 30-ти постном отображении, ну никак нет страниц 123 и 125, т.к их всего 48. Так что начинать нужно не со страниц а с постов, ведь у каждого по разному. Получается начинать читать нужно с #1221 по #1250 пост включительно, если считать начало 123 и конец 125 страниц.
P.S 5-ти постное = 283 страницы
10-ти постное (По умолчанию) = всего 142 страницы
20-ти постное = всего 71 страница
30-ти постное = всего 48 страниц
40-ка постное = всего 36 страниц
на момент этого поста
Gambetto
06-12-2012, 16:16
Озадачился определением версии системы.
В справке нашел пару примеров:
1. Pos('XP Service Pack 2', SystemVersionPanel.Text);
2. Version.NTPlatform and (Version.Major = 5) and (Version.Minor = 1) and (Version.ServicePackMajor = 2).
И появились вопросы.. SystemVersionPanel - это что, объект? Где-то описано вообще?
Во втором случае Version, как я понял, это переменная типа "запись" TWindowsVersion.
И не относящийся к задаче вопрос, касаемый функции MsgBox. Где она и другие подобные описываются? В справке как-то ну очень сжато, лишь на примерах кода. Даже без указания возможных вариантов кнопок или значков в выдаваемых окнах.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.