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

Ответить
 • Просмотры: 14
Аватара пользователя
JHeavy

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение JHeavy »

Здравствуйте, подскажите как сделать чтобы в списке компонентов (чекбоксы) можно было выбрать только один из компонентов?
Аватара пользователя
R.i.m.s.k.y.

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение R.i.m.s.k.y. »

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

Идея в том, чтобы клиент скидывал мне серийный номер, а я ему отправлял правильный пароль.



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



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]

Сообщение R.i.m.s.k.y. »

RodionSabitov, думаю твой случай WinApi функция
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]

Сообщение al70 »

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]

Сообщение Johny777 »

Цитата El Sanchez:



где-то читал, что приложение считается зависшим, если не отвечает на действия системы в течение 5 сек.
Скрипты Inno Setup. Помощь и советы [часть 5]




в реестре наверное



HKCU\Control Panel\Desktop

"HungAppTimeout"="5000"



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

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение pritoreanic »

Цитата R.i.m.s.k.y.:



значение параметра 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]

Сообщение InnoQuest »

Цитата Johny777:



гуманных не нашёл,
Скрипты Inno Setup. Помощь и советы [часть 5]




по сути WM_CLOSE единственный верный способ закрытия приложения. Привилегии нужны только для работы с системными процессами, поэтому не стоит. антивирь с привилегиями не убьешь, если это нормальный антивирь, а вот систему - запросто. да и в инно давно уже это есть на автомате. правда для систем выше ХР, но тенденция такова, что ХР поддерживает все меньше и меньше приложений.
Аватара пользователя
R.i.m.s.k.y.

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение R.i.m.s.k.y. »

InnoQuest, а ответ один - добавлять к строчкам параметр Components: 1 2 3

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]

Сообщение Johny777 »

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]

Сообщение InnoQuest »

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





Код:

Код: Выделить всё

[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 на деинсталляторе с сокрытием лейбелов?
Ответить

Вернуться в «Автоматическая установка приложений»