Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Закрытая тема
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 5]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2
Скрипты Inno Setup. Помощь и советы [часть 3]
Скрипты Inno Setup. Помощь и советы [часть 4]

Отправлено: 03:49, 21-05-2012

 

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Пацаны, помогите пожалуйста создать настоящий генератор случайных чисел!
дело в том, что функция 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: извините, что выношу вам мозг своими злостными потребностями
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:04, 30-11-2012 | #1341



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени суток! Как сделать такой серийный номер, который будет зависеть от каких-либо параметров компьютера?
Идея в том, чтобы клиент скидывал мне серийный номер, а я ему отправлял правильный пароль.

есть функция (взята из справки, как просто вводить определенный серийный номер), например по маске:

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;

Отправлено: 11:57, 30-11-2012 | #1342


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


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;

Отправлено: 16:41, 01-12-2012 | #1343


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030

Профиль | Отправить PM | Цитировать


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;
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:54, 01-12-2012 | #1344


Аватара для R.i.m.s.k.y.

Ветеран


Сообщения: 1640
Благодарности: 536

Профиль | Отправить PM | Цитировать


Цитата El Sanchez:
где-то читал, что приложение считается зависшим, если не отвечает на действия системы в течение 5 сек. »
в реестре наверное

HKCU\Control Panel\Desktop
"HungAppTimeout"="5000"

так что ждать нужно не 5сек, а значение параметра HungAppTimeout

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:30, 01-12-2012 | #1345


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Цитата R.i.m.s.k.y.:
значение параметра HungAppTimeout »
вероятнее всего это 5000 миллисекунд = 5 секунд, ваш Кэп.
==========================================================

El Sanchez, Ты можешь пожалуйста научить свою функцию так чтоб она ещё и путь к файлу сравнивала как у меня, ну короче чтоб при необходимости только определённые процессы завершать.
(а то получается грохнули одного Васю, другого, а фамилию не спросили)
Я боюсь это делать, тк когда свою функцию ваял мне показали 2 раза синий экран, и сейчс ещё раз когда твою функцию дополнял
Цитата El Sanchez:
TerminateProcess стоит применять в крайнем случае, когда другие способы завершения процесса не помогают »
не знал, но ради интереса поискал другие более гуманные способы, других не нашёл. Ну кроме закрытия окна программы:
Цитата El Sanchez:
Нужно послать окну программы сообщение WM_CLOSE »
гуманных не нашёл, но наткнулся на более зверский:
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 раза меньше)
но в оконном режиме, закрытие окна работает на ура

Отправлено: 03:33, 02-12-2012 | #1346


Аватара для Gnom_aka_Lexander

Ветеран


Сообщения: 978
Благодарности: 564

Профиль | Сайт | Отправить PM | Цитировать


Цитата Johny777:
гуманных не нашёл, »
по сути WM_CLOSE единственный верный способ закрытия приложения. Привилегии нужны только для работы с системными процессами, поэтому не стоит. антивирь с привилегиями не убьешь, если это нормальный антивирь, а вот систему - запросто. да и в инно давно уже это есть на автомате. правда для систем выше ХР, но тенденция такова, что ХР поддерживает все меньше и меньше приложений.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:37, 02-12-2012 | #1347


Аватара для habib2302

Ветеран


Сообщения: 862
Благодарности: 102

Профиль | Отправить PM | Цитировать


Люди.помогите мне объеденить эти два кода и чтобы они работали одновременно.Здесь один код на работу 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 нет.

вот коды

Код: Выделить весь код
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;

-------
Помог? От "Полезное сообщение" не откажусь!!!


Последний раз редактировалось habib2302, 04-12-2012 в 11:37.


Отправлено: 11:28, 04-12-2012 | #1348


Аватара для Gnom_aka_Lexander

Ветеран


Сообщения: 978
Благодарности: 564

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
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.
и плюнь в лицо тому, кто учил тебя ТАК объединять код.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:20, 04-12-2012 | #1349


Аватара для habib2302

Ветеран


Сообщения: 862
Благодарности: 102

Профиль | Отправить PM | Цитировать


вот полный скрипт на лого

Код: Выделить весь код
[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.
»
огромное спасибо!!!!только вместо точки на конце end. нужно было вставить ; точку с запятой

и как сделать растяжение wizardsmallimage на деинсталляторе с сокрытием лейбелов?

-------
Помог? От "Полезное сообщение" не откажусь!!!


Последний раз редактировалось habib2302, 04-12-2012 в 12:36.


Отправлено: 12:28, 04-12-2012 | #1350



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход