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

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

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

Аватара для 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] - Скачать;

  • RegExporter - Фриварная утилита для экспорта реестра и конвертации файлов *.reg и *.ini в инсталляционные скрипты Inno Setup и NSIS.
    Последняя версия: 1.2.0 [23.09.2014] - Скачать;



Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

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

Отправлено: 11:48, 10-03-2014

 

Пользователь


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

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


saurn, есть ли варианты без использования IsTasks.dll?

Отправлено: 23:36, 11-12-2014 | #2151



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

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


Пользователь


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

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


помогите увязать
Код: Выделить весь код
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall:
begin
BackupCheck_2();
BackupCheck_3();
end;
ssDone:
begin
RewritingUninstallData();
end;
end;
end;
и
Код: Выделить весь код
begin
   If CurStep=ssInstall then
begin
  CreateDir(ExpandConstant('{app}\res_mods'));
  CreateLogMods();
end;
end;
заранее спс

Отправлено: 23:42, 11-12-2014 | #2152


Аватара для Habetdin


Автор проектов


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

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


svs23,
Код: Выделить весь код
procedure CurStepChanged(CurStep: TSetupStep);
begin
	case CurStep of
	ssInstall:
		begin
			BackupCheck_2();
			BackupCheck_3();
			CreateDir(ExpandConstant('{app}\res_mods'));
			CreateLogMods();
		end;
	ssDone:
		begin
			RewritingUninstallData();
		end;
	end;
end;

-------
Рекомендую: $25 на тест виртуального сервера (VPS) за регистрацию по ссылке

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

Отправлено: 23:49, 11-12-2014 | #2153


Ветеран


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

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


Цитата Kashtan007:
есть ли варианты без использования IsTasks.dll? »
Объеденить примеры из шапки:
Запущен ли процесс, Закрытие процесса
Скрытый текст
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp


[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_TERMINATE = $1;
    PROCESS_CREATE_THREAD = $2;
    PROCESS_QUERY_INFORMATION = $400;
    SYNCHRONIZE = $100000;
    TOKEN_QUERY = $8;
    TOKEN_ADJUST_PRIVILEGES = $20;
    SE_PRIVILEGE_ENABLED = $2;
    TA_FAILED = 0;
    TA_SUCCESS_CLEAN = 1;
    TA_SUCCESS_KILL = 2;
    WM_CLOSE = $10;
    WAIT_OBJECT_0 = $0;
    WAIT_TIMEOUT = $102;
    WAIT_FAILED = $FFFFFFFF;
    SMTO_BLOCK = $1;
    SMTO_ABORTIFHUNG = $2;

type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of Char;
    end;

    LUID = record
        LowPart: DWORD;
        HighPart: Longint;
    end;

    LUID_AND_ATTRIBUTES = record
        Luid: LUID;
        Attributes: DWORD;
    end;

    TOKEN_PRIVILEGES = record
        PrivilegeCount: DWORD;
        Privileges: array [0..0] of LUID_AND_ATTRIBUTES;
    end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
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';
#endif
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@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: LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetProcessImageFileName(hProcess: THandle; var lpImageFileName: Char; nSize: DWORD): DWORD; external 'GetProcessImageFileName{#A}@psapi.dll stdcall';
function GetLogicalDrives(): DWORD; external 'GetLogicalDrives@kernel32.dll stdcall';
function QueryDosDevice(lpDeviceName: String; var lpTargetPath: Char; ucchMax: DWORD): DWORD; external 'QueryDosDevice{#A}@kernel32.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 GetProcAddress(hModule: THandle; lpProcName: AnsiString): Longint; external 'GetProcAddress@kernel32.dll stdcall';
function GetModuleHandle(lpModuleName: String): THandle; external 'GetModuleHandle{#A}@kernel32.dll stdcall';
function CreateRemoteThread(hProcess: THandle; lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; external 'CreateRemoteThread@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function GetWindowThreadProcessId(hWnd: HWND; var lpdwProcessId: DWORD): DWORD; external 'GetWindowThreadProcessId@user32.dll stdcall';
function SendMessageTimeout(hWnd: HWND; Msg: UINT; wParam, lParam: Longint; fuFlags, uTimeout: UINT; var lpdwResult: Longint): Longint; external 'SendMessageTimeout{#A}@user32.dll stdcall';

////////////////////////////////////////////////////////////
function IsProcessRunning(FileName: String): Boolean; //FileName - имя exe-файла процесса
var
    hProcessSnap: THandle;
    pe32: TPROCESSENTRY32;
    szExeFile: String;
begin
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    pe32.dwSize := sizeof(pe32);
    if not Process32First(hProcessSnap, pe32) then Exit;
    while not Result and Process32Next(hProcessSnap, pe32) do
    begin
        szExeFile := '';
        while not (pe32.szExeFile[Length(szExeFile)] = #0) do szExeFile := szExeFile + pe32.szExeFile[Length(szExeFile)];
        Result := LowerCase(FileName) = LowerCase(szExeFile);
    end;
    CloseHandle(hProcessSnap);
end;

/////////////////////////////////////////////////////////
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;
    lResult: Longint;
begin
    Result := True;
    GetWindowThreadProcessId(hwnd, dwID);
    if dwID = lParam then
        Result := SendMessageTimeout(hwnd, WM_CLOSE, 0, 0, SMTO_BLOCK or SMTO_ABORTIFHUNG, 5000, lResult) <> 0;
end;

//////////////////////////////////////////////////////////////////////////////////
function TerminateApp(const szProcessList: String; const dwTimeout: DWORD): DWORD;
// szProcessList :  process names or full paths of processes delimited by vertical bar, e.g. calc.exe|notepad.exe|c:\hungtest.exe
// dwTimeout.....:  kill timeout in ms
var
    hProcessSnap, hProc, hToken, hThread, lpProcName: THandle;
    pe32: TPROCESSENTRY32;
    aBuf: array [0..259] of Char;
    bProcFind: Boolean;
    szExeFile, szExePath, szFileName, szDeviceName: String;
    tkp: TOKEN_PRIVILEGES;
    SeDebugNameValue: LUID;
    i, ret: Longint;
    lpThreadId, dwDrives: DWORD;
begin
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    try
        with TStringList.Create do
        try
            StringChangeEx(szProcessList, '|', #13#10, True);
            Text := szProcessList;
            //
            pe32.dwSize := SizeOf(pe32);
            if not Process32First(hProcessSnap, pe32) then Exit;
            repeat
                bProcFind := False;
                szExeFile := CharArrayToString(pe32.szExeFile);
                for i := 0 to Count-1 do
                begin
                    if CompareText(szExeFile, ExtractFileName(Strings[i])) = 0 then
                    begin
                        bProcFind := True;
                        szExePath := Strings[i];
                        Break;
                    end;
                end;
                if not bProcFind then Continue;

                // try open process
                hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
                if hProc = TA_FAILED then
                begin
                    // open process token adjust privileges
                    if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
                    if not LookupPrivilegeValue('', 'SeDebugPrivilege', SeDebugNameValue) then Exit;
                    try
                        // fill token privileges struct
                        tkp.PrivilegeCount := 1;
                        tkp.Privileges[0].Luid := SeDebugNameValue;
                        tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

                        // set debug privileges
                        if not AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret) then Exit;

                        // try open process with debug privileges
                        hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
                        if hProc = TA_FAILED then Exit;
                    finally
                        tkp.Privileges[0].Attributes := 0;
                        AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret);
                        CloseHandle(hToken);
                    end;
                 end;

                // if szProcess is full path
                if CompareText(szExePath, szExeFile) <> 0 then
                begin
                    GetProcessImageFileName(hProc, aBuf[0], SizeOf(aBuf));
                    szFileName := CharArrayToString(aBuf);
                    dwDrives := GetLogicalDrives();
                    for i := 2 to 25 do if dwDrives and (1 shl i) <> 0 then
                    begin
                        QueryDosDevice(Format('%s:', [Chr(Ord('A') + i)]), aBuf[0], SizeOf(aBuf));
                        szDeviceName := CharArrayToString(aBuf);
                        if Pos(szDeviceName, szFileName) = 0 then Continue;
                        StringChangeEx(szFileName, szDeviceName, Format('%s:', [Chr(Ord('A') + i)]), True);
                        if CompareText(szExePath, szFileName) = 0 then Break;
                    end;
                    if CompareText(szExePath, szFileName) <> 0 then
                    begin
                        CloseHandle(hProc);
                        Continue;
                    end;
                end;

                // try stop process
                try
                    if not EnumWindows(CallbackAddr('EnumWindowsProc'), pe32.th32ProcessID) then
                    begin
                        if TerminateProcess(hProc, 0) then Result := TA_SUCCESS_KILL;
                    end else case WaitForSingleObject(hProc, dwTimeout) of
                        WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                        WAIT_TIMEOUT: try
                            lpProcName := GetProcAddress(GetModuleHandle('kernel32.dll'), 'ExitProcess');
                            if lpProcName = 0 then Exit;
                            hThread := CreateRemoteThread(hProc, 0, 0, lpProcName, 0, 0, lpThreadId);
                            case WaitForSingleObject(hThread, dwTimeout) of
                                WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                                WAIT_TIMEOUT, WAIT_FAILED: if TerminateProcess(hProc, 0) then Result := TA_SUCCESS_KILL;
                            end;
                        finally
                            CloseHandle(hThread);
                        end;
                    end;
                finally
                    CloseHandle(hProc);
                end;
            until not Process32Next(hProcessSnap, pe32);
        finally
            Free;
        end;
    finally
        CloseHandle(hProcessSnap);
    end;
end;

/////////////////////////////
function IsCheckProcessRunning( const ProcName: String ): Boolean;
begin
    Result := not IsProcessRunning( ProcName );
    if not Result then
      if ( mrYes = MsgBox( Format( '%s "%s" %s'#13#13'%s', ['Процесс', ProcName, 'запущен. Закрыть процесс?', 'Нажатие "Нет" прервет установку.']), mbError, mb_YesNo ) ) then
        begin
            TerminateApp(ProcName, 5000);
            Result := True;
        end;
end;

function InitializeSetup(): Boolean;
begin
    Result := IsCheckProcessRunning( 'calc.exe' );
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:23, 12-12-2014 | #2154


Пользователь


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

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


Код: Выделить весь код
// save dialog
        szFileName := ExtractFileName(szURL);
        if GetSaveFileName('Сохранить как...', szFileName, '', Format('*%s', [ExtractFileExt(szFileName)]), ExtractFileExt(szFileName)) then
        try
            hFile := CreateFile(szFileName, GENERIC_READ or GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);  //create file
            if hFile = 0 then Exit;
            hHeap := GetProcessHeap();
            lpBuffer := HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4*1024);     // buffer size must be >= 512Kb
            ib.dwStructSize := SizeOf(ib);
            ib.lpvBuffer := lpBuffer;
            ib.dwBufferLength := HeapSize(hHeap, 0, lpBuffer);
как изменить данный блог,чтобы файл сохранялся в определенную директорию???

Отправлено: 12:06, 12-12-2014 | #2155


Ветеран


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

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


icetanker, без диалога сохранить как?
http://forum.oszone.net/post-2149509-442.html
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:59, 12-12-2014 | #2156


Пользователь


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

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


Всем доброго дня!
Подскажите плиз, вот есть 2 типа установки (полный и выборочный) и компоненты, два из которых взаимоисключающие.
Код: Выделить весь код
[Types]
Name: "full"; Description: {cm:full}
Name: "custom"; Description: {cm:custom}; Flags: iscustom 
[Components]
Name: "srv"; Description: {cm:srv}; Types: full custom;
Name: "srv\k7"; Description: {cm:srvk7}; Types: full custom; Flags: exclusive
Name: "srv\k6"; Description: {cm:srvk6}; Types: full custom; Flags:  exclusive
Name: "client"; Description: {cm:client}; Types: full custom
При этом, если на странице выбора компонентов выбирать 1й exclusive компонент, то тип установки получается "выборочный", а если 2й, то "полный". Можно ли как-то это поправить?

Отправлено: 13:24, 12-12-2014 | #2157


Аватара для nik1967

Старожил


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

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


Цитата Shkutu:
Можно ли как-то это поправить? »
Что именно поправить? Конкретнее.
Name: "srv\k7"; Description: {cm:srvk7}; Types: full custom; Flags: exclusive - почему 2 значения типа сразу? Либо full, либо custom
Name: "srv\k6"; Description: {cm:srvk6}; Types: full custom; Flags: exclusive - почему 2 значения типа сразу? Либо full, либо custom
Name: "client"; Description: {cm:client}; Types: full custom - почему 2 значения типа сразу? Либо full, либо custom

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".


Отправлено: 14:00, 12-12-2014 | #2158


Пользователь


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

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


Изображения
Тип файла: jpg types.jpg
(14.6 Kb, 14 просмотров)

nik1967, почему либо-либо? Это компоненты, которые относятся к обоим типам установки. Отличие полного от неполного в том, что при полном выбран _весь_ набор компонентов, а при выборочном какие-то компоненты не выбраны, при этом выбрать можно _любой_.
Теперь попытаюсь еще раз объяснить, в чем проблема. Есть один родительский компонент, у которого 2 дочерних exclusive компонента (грубо говоря 2 варианта реализации одного сервера, которые выбираются в зависимости от условий). Когда мы выбираем все компоненты, включая этот сервер, тип установки доложен быть полным (собственно при отсутствии exclusive так и происходит). Но в данном случае по факту получаем, что при выборе сервера 1го варианта тип не полный, а выборочный (при выборе второго варианта exclusive тип полный). Вопрос в том, как сделать так, чтобы при выборе любого варианта сервера вместе с остальными компонентами, тип установки становился полным.

Отправлено: 14:28, 12-12-2014 | #2159


Аватара для Dodakaedr

Ветеран


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

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


Цитата Irenis:
как создать ярлык в формате exe, чтобы этот ярлык просто открывал страницу в браузере? »
Можно вот так создать
Скрытый текст
Код: Выделить весь код
[Setup]
AppName=TestIcon
AppVersion=1.0
CreateAppDir=no
OutputDir=Ярлык в .exe формате
SetupIconFile=icon.ico

[Code]
function InitializeSetup(): Boolean;
var
rcode: Integer;
begin
 ShellExec('', 'www.oszone.net', '', '', SW_SHOW, ewNoWait, rcode);
 Result := False;
end;

-------
Inno Setup 5 Ultra Unicode


Отправлено: 14:48, 12-12-2014 | #2160



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 6] El Sanchez Автоматическая установка приложений 2494 10-03-2014 11:51
Скрипты Inno Setup. Помощь и советы [часть 5] El Sanchez Автоматическая установка приложений 1999 28-03-2013 19:09
Скрипты 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




 
Переход