Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

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

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

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


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

Отправлено: 19:06, 28-03-2013

 

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


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

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


Цитата saurn:
Исправленный пример в моем предыдущем посте »
Все супер. Пришлось добавить ещё одно "end" после FindClose чтобы заработало. Спасибо огромное.
Есть ещё такой вопрос. Планирую перекинуть некоторые файлы на сервак. На данный момент файл или папка устанавливается только если выбран нужен компонент.
Встречал скрипт как закачивать файл с нета но я никак не могу связать с компонентами. Нужно так чтобы если компонент выбран происходила загрузка файла. Если возможно; файлы в .zip можно будет розпаковать?. Спс.

Отправлено: 06:00, 17-01-2014 | #1861



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

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


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


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

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


Цитата saurn:
С этим кодом все в порядке. Просто вы компилируете на стандартной версии Inno. Установите расширенную версию от китайских собратьев, она есть в шапке соседней темы http://forum.oszone.net/showthread.php?p=1201499# , и проблема исчерпает себя. »
поставил рекомендуемую сборку, всё выполнил по инструкции из той шапки http://clip2net.com/s/6C14gJ
запустил злощастный код, вылезло следующее: http://clip2net.com/s/6C13Ab
дважды переставил и ANSI и UNICODE попробовал, что ж за беда то такая....

Последний раз редактировалось novahudonoser, 17-01-2014 в 09:16.


Отправлено: 09:03, 17-01-2014 | #1862


Ветеран


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

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


Цитата PerfectLove:
Есть ещё такой вопрос. Планирую перекинуть некоторые файлы на сервак. На данный момент файл или папка устанавливается только если выбран нужен компонент.
Встречал скрипт как закачивать файл с нета но я никак не могу связать с компонентами. Нужно так чтобы если компонент выбран происходила загрузка файла. Если возможно; файлы в .zip можно будет розпаковать?. Спс. »
Было несколько примеров по теме в этой ветке форума.

Цитата novahudonoser:
запустил злощастный код, вылезло следующее »
Несовпадение параметров в файле сообщений. Что-то сделали не так. Вероятнее всего, он у вас от другой версии. Попробуйте версию, которой я пользуюсь is551e.7z. Замените файлами из архива содержимое папки Inno Setup 5, и попробуйте последний пример из этого поста http://forum.oszone.net/post-2290655-1860.html
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:14, 17-01-2014 | #1863


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


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

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


saurn, крутяк!
скопировал из твоего архива Default.isl и всё заработало.
Огромное спасибо за помощь.

Отправлено: 09:21, 17-01-2014 | #1864


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


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

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


как на этапе установки MsgBox присвоить свой title текст?

а то сейчас там одно не информативное слово "Установка" http://clip2net.com/s/6C1B8x
Код: Выделить весь код
function InitializeSetup(): Boolean;
begin
    Result := not IsProcessRunning('calc.exe');
    if not Result then MsgBox('Программа сейчас в работе'+ Chr(10)+'Закройте приложение выбрав пункт меню "Закрыть программу"'+ Chr(10)+'И повторите установку обновления.', mbError, MB_OK);
end;

Отправлено: 09:54, 17-01-2014 | #1865


Ветеран


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

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


Цитата novahudonoser:
как на этапе установки MsgBox присвоить свой title текст? »
Использовать системные MessageBox или форму MsgBoxEx из расширенной версии от китайцев:
Код: Выделить весь код
MsgBoxEx(Application.Handle, 'Текст сообщения.', 'Заголовок формы', MB_YESNO or MB_ICONWARNING, 0, 0);
Системные MessageBox
Расширенный вариант от Johny777

Последний раз редактировалось saurn, 17-01-2014 в 10:15.

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

Отправлено: 10:02, 17-01-2014 | #1866


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


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

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


а кто ещё подскажет как на этапе деинсталяции завершить процесс?
я пробовал пример из Inno Faq 1.4.chm используя ISTask.dll но она не робит, точней не находит процесс и деинсталяции проходит в нормальном режиме
Код: Выделить весь код
[Files]
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion
// функции используемые при деинсталляции
// RunTask@{app}\ISTask.dll - название функции (в данном случае, если программа работает)
// и путь dll'ки где она расположена...

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';
function KillTask(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  if RunTask('calc.exe', False) then
    begin
      // прячем форму
      UninstallProgressForm.Visible:= False;
      if MsgBox('Программа calc.exe используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
        begin
          KillTask('calc.exe');
          UnloadDll(ExpandConstant('{app}\ISTask.dll'));
          // показываем форму
          UninstallProgressForm.Visible:= True;
        end
      else
        begin
          MsgBox('Завершите работу calc.exe, затем снова запустите программу удаления.', mbInformation, MB_OK);
          UnloadDll(ExpandConstant('{app}\ISTask.dll'));
          Abort;
        end;
    end;
end;

Отправлено: 11:36, 17-01-2014 | #1867


Ветеран


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

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


Цитата novahudonoser:
а кто ещё подскажет как на этапе деинсталяции завершить процесс? »
По тому же принципу, только выполнять завершение процесса следует в теле InitializeUninstall или на шаге usUninstall
Пример
Код: Выделить весь код
#ifndef IS_ENHANCED
    #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif


[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.


[Code]
#define A = (Defined UNICODE) ? "W" : "A"


const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_TERMINATE = $1;
    PROCESS_CREATE_THREAD = $2;
    PROCESS_VM_OPERATION = $8;
    PROCESS_VM_READ = $10;
    PROCESS_VM_WRITE = $20;
    PROCESS_QUERY_INFORMATION = $400;
    SYNCHRONIZE = $100000;
    MEM_COMMIT = $1000;
    MEM_RESERVE = $2000;
    PAGE_EXECUTE_READWRITE = $40;
    TOKEN_QUERY = $8;
    TOKEN_ADJUST_PRIVILEGES = $20;
    SE_PRIVILEGE_ENABLED = $2;
    MAX_PATH = 260;
    TA_FAILED = 0;
    TA_SUCCESS_CLEAN = 1;
    TA_SUCCESS_KILL = 2;
    WM_CLOSE = $10;
    WAIT_OBJECT_0 = $0;
    WAIT_TIMEOUT = $102;


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 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: String): Longint; external 'GetProcAddress@kernel32.dll stdcall';
function GetModuleHandle(lpModuleName: String): THandle; external 'GetModuleHandle{#A}@kernel32.dll stdcall';
function VirtualAllocEx(hProcess: THandle; lpAddress, dwSize: Longint; flAllocationType, flProtect: DWORD): Longint; external 'VirtualAllocEx@kernel32.dll stdcall';
function WriteProcessMemory(hProcess: THandle; lpBaseAddress, lpBuffer, nSize: Longint; var lpNumberOfBytesWritten: Longint): BOOL; external 'WriteProcessMemory@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 GetLogicalDrives: DWord; external 'GetLogicalDrives@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 szProcess: String; dwTimeout: DWORD): DWORD;
var
    hProcessSnap, hProc, hToken, hThread, lpProcName: THandle;
    pe32: TPROCESSENTRY32;
    aBuf: array [0..259] of Char;
    szFileName, szDeviceName: String;
    tkp: TOKEN_PRIVILEGES;
    SeDebugNameValue: LUID;
    i, lpMemory, ret: Longint;
    lpThreadId, dwDrives: DWORD;
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), ExtractFileName(szProcess)) <> 0 then Continue;
            hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
            if hProc = TA_FAILED then
            begin
                if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
                if not LookupPrivilegeValue('', 'SeDebugPrivilege', SeDebugNameValue) then Exit;
                try
                    tkp.PrivilegeCount := 1;
                    tkp.Privileges[0].Luid := SeDebugNameValue;
                    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
                    if not AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret) then Exit;
                    hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE 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 CompareText(szProcess, ExtractFileName(szProcess)) <> 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(szProcess, szFileName) = 0 then Break;
                end;
                if CompareText(szProcess, szFileName) <> 0 then
                begin
                    CloseHandle(hProc);
                    Continue;
                end;
            end;
            try
                EnumWindows(CallbackAddr('EnumWindowsProc'), pe32.th32ProcessID);
                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;
                        lpMemory := VirtualAllocEx(hProc, 0, SizeOf(lpProcName), MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
                        if not WriteProcessMemory(hProc, lpMemory, lpProcName, SizeOf(lpProcName), ret) then Exit;
                        hThread := CreateRemoteThread(hProc, 0, 0, lpMemory, 0, 0, lpThreadId);
                        if hThread > 0 then
                        case WaitForSingleObject(hThread, dwTimeout) of
                            WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                            WAIT_TIMEOUT: if TerminateProcess(hProc, 0) then Result := TA_SUCCESS_KILL;
                        end;
                    finally
                        CloseHandle(hThread);
                    end;
                end;
            finally
                CloseHandle(hProc);
                if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then Exit;
            end;
        end;
    finally
        CloseHandle(hProcessSnap);
    end;
end;


function IsProcessRunning(FileName: String): Boolean;
var
    objSWbemLocator, objSWbemServices: Variant;
begin
    try
        objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    except
        ShowExceptionMessage;
        Exit;
    end;

    objSWbemServices := objSWbemLocator.ConnectServer();
    objSWbemServices.Security_.ImpersonationLevel := 3;
    Result := (objSWbemServices.ExecQuery('SELECT * FROM Win32_Process WHERE Name="' + FileName + '"').Count > 0);
end;


function InitializeUninstall(): Boolean;
var
    pName: String;
begin
    pName := 'calc.exe';

    Result := not IsProcessRunning(pName);
    if not Result then
    begin
        TerminateApp(pName, 5000);
        Result := True;
    end;
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:50, 17-01-2014 | #1868


Старожил


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

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


novahudonoser ISTask.dll работает только в ansi в unicode не работает
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:10, 17-01-2014 | #1869


Аватара для Mailchik

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


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

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


ISTaskU.dll
Как-то давно скомпилил ISTask.dll от Genri для юникодовой Inno Setup.
Большой размер, из-за использования Delphi XE3.
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: "ISTaskU.dll"; Flags: dontcopy;

[Code]
function KillTask(ExeFileName: string): Integer;
  external 'KillTask@files:ISTaskU.dll stdcall';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
  external 'RunTask@files:ISTaskU.dll stdcall';

function InitializeSetup(): Boolean;
begin
  If RunTask('aimp3.exe', false) then begin
    if MsgBox('Закрыть AIMP?', mbError, mb_YesNo) = idYes then begin
      KillTask('aimp3.exe');
      Result := True;
    end else
      Exit;
    end;
  Result := True;
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:08, 17-01-2014 | #1870



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты 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
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59




 
Переход