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

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

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

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

Ветеран


Contributor


Сообщения: 1273
Благодарности: 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

 

Забанен


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

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


Цитата Johny777:
используй дизайнер расширенной http://forum.oszone.net/thread-148707-30.html версии
создай там панель и настрой BevelInner и BevelOuter »
Расширенный это там где Редактор форм?
Что за BevelInner и BevelOuter, как мне их найти?

Отправлено: 11:00, 03-07-2012 | #361



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

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


Забанен


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

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


Цитата nik1967:
Да бевел это. »
Что-то разобратся не могу что мне с ними сделать.

Отправлено: 11:19, 03-07-2012 | #362


Аватара для alert30

Ветеран


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

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


Цитата L1nk3R:
Что-то разобратся не могу что мне с ними сделать. »
Ну так скрипт от nik1967 копипастить в секции Code.

Отправлено: 11:44, 03-07-2012 | #363


Аватара для nik1967

Старожил


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

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


Цитата L1nk3R:
Что-то разобратся не могу что мне с ними сделать. »
Простой пример
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: Redist; Description: Дополнительное программное обеспечение: 
Name: Redist\DirectXCheck; Description: Обновить DirectX
Name: Redist\PhysXCheck; Description: Установить Nvidia PhysX

[_Code]
procedure InitializeWizard();
begin
  with TBevel.Create(WizardForm) do begin
    SetBounds(ScaleX(0),ScaleY(30),ScaleX(365),ScaleY(80));
    Shape:= bsBox;
    Parent:= WizardForm.SelectTasksPage;
  end;
  with WizardForm.TasksList do
    SetBounds(ScaleX(5),ScaleY(35),ScaleX(350),ScaleY(70));
end;

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

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

Отправлено: 12:00, 03-07-2012 | #364


Забанен


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

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


Всем спасибо разобрался наконец. В итоге вот что мне нужно было
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: Redist; Description: Дополнительное программное обеспечение: 
Name: Redist\DirectXCheck; Description: Обновить DirectX
Name: Redist\PhysXCheck; Description: Установить Nvidia PhysX

[_Code]
procedure InitializeWizard();
begin
  WizardForm.TasksList.BorderStyle := bsSingle;
  with WizardForm.TasksList do SetBounds(ScaleX(5),ScaleY(35),ScaleX(350),ScaleY(70));
end;
Johny777, nik1967, оказывается не Bevel это а BorderStyle.

Последний раз редактировалось L1nk3R, 03-07-2012 в 13:38.


Отправлено: 13:23, 03-07-2012 | #365


Аватара для nik1967

Старожил


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

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


L1nk3R,
Тогда уж так
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: Redist; Description: Дополнительное программное обеспечение: 
Name: Redist\DirectXCheck; Description: Обновить DirectX
Name: Redist\PhysXCheck; Description: Установить Nvidia PhysX

[ Code]
procedure InitializeWizard();
begin
  with WizardForm.TasksList do begin
    Height := ScaleY(70);
    BorderStyle := bsSingle;
  end;
end;

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

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

Отправлено: 14:33, 03-07-2012 | #366


Аватара для Johny777

Ветеран


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

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


Цитата nik1967:
Да бевел это. »
всё мимо
В итоге оказалось, что это стиль границы листбокса задач

====================================================================================================


У меня возник вопрос
при удалении игры деинсталятор ориентируется на экзешник
есть экзешник там = есть и игра = есть активный чекбокс на форме
если же в диспетчере задач висит процесс этого самого экзешника и при этом попытаться его удалить, то удаляется всё кроме него, а он остаётся
те никаких ошибок и прочего

подскажите пожалуйста как определить директорию расположения экзешника, процесс которого висит
(определение процесса уже есть в шапке в 2-х вариантах)
почему именно папку?
дело в том, что речь идёт о процессе hl2.exe а он может быть и не от моей пиратки, а от другой или от steam версии
и было бы некрасиво завершать процесс слева, удаляя справа

также прошу не помогать мне если писанина подобного кода является трудоёмкой задачей, тк это "косметическая" правка и нацелена она
на устранение хоть и надеюсь редкого, но возможного конфликта.

Последний раз редактировалось Johny777, 03-07-2012 в 19:43.


Отправлено: 19:26, 03-07-2012 | #367


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

Ветеран


Contributor


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

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


Johny777, определение рабочей папки процесса:
читать дальше »

Код: Выделить весь код
[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_QUERY_INFORMATION = $400;
    PROCESS_VM_READ = $10;
    MAX_PATH = 260;

type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..MAX_PATH-1] of Сhar;
    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 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 GetLogicalDriveStrings(nBufferLength: DWORD; var lpBuffer: Char): DWORD; external 'GetLogicalDriveStrings{#A}@kernel32.dll stdcall';
function QueryDosDevice(lpDeviceName: String; var lpTargetPath: Char; ucchMax: DWORD): DWORD; external 'QueryDosDevice{#A}@kernel32.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';

function CharArrayToString(aChar: array of Char): String;
begin
    Result := '';
    while not (aChar[Length(Result)] = #0) do Result := Result + aChar[Length(Result)];
end;

function GetProcessWorkingDirectory(ProcessName: String): TArrayOfString;
var
    hProcessSnap, hProc: THandle;
    pe32: TPROCESSENTRY32;
    szExeFile, szDrives, szDeviceName: array [0..MAX_PATH-1] of Char;
    sDeviceName: String;
    i, iLen: DWORD;
begin
    SetArrayLength(Result, 0);
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    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(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pe32.th32ProcessID);
            if GetProcessImageFileName(hProc, szExeFile[0], MAX_PATH) = 0 then Exit;
            SetArrayLength(Result, GetArrayLength(Result)+1);
            Result[GetArrayLength(Result)-1] := CharArrayToString(szExeFile);
            iLen := GetLogicalDriveStrings(MAX_PATH, szDrives[0]);
            if iLen = 0 then Exit;
            i := 0;
            while i <= iLen-3 do
            begin
                if QueryDosDevice(szDrives[i] + ':', szDeviceName[0], MAX_PATH) > 0 then
                begin
                    sDeviceName := CharArrayToString(szDeviceName);
                    if (Length(sDeviceName) <= Length(Result[GetArrayLength(Result)-1])) and
                    (Pos(sDeviceName, Result[GetArrayLength(Result)-1]) = 1) then
                    begin
                        StringChangeEx(Result[GetArrayLength(Result)-1], sDeviceName, szDrives[i] + ':', True);
                        Result[GetArrayLength(Result)-1] := RemoveBackSlash(ExtractFilePath(Result[GetArrayLength(Result)-1]));
                        Break;
                    end;
                end;
                i := i + 4;
            end;
            CloseHandle(hProc);
        end;
    end;
    CloseHandle(hProcessSnap);
end;

procedure InitializeWizard();
var
    szArray: TArrayOfString;
    i: Integer;
begin
    //хочу знать откуда калькуляторы запущены
    szArray := GetProcessWorkingDirectory('calc.exe');
    if GetArrayLength(szArray) > 0 then for i := 0 to GetArrayLength(szArray)-1 do MsgBox(szArray[i], mbInformation, MB_OK);
end;

Последний раз редактировалось El Sanchez, 20-07-2012 в 13:10. Причина: обрабатываем и 64-битные процессы

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

Отправлено: 22:04, 03-07-2012 | #368


Аватара для Johny777

Ветеран


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

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


El Sanchez, огромное спасибо за функцию
результат:
if GetProcessWorkingDirectory('hl2.exe') = ExpandConstant('{app}\common\half-life 2') then Exec('taskkill', '/f /im hl2.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
работает отлично!
надеюсь тебе было не в напряг

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,

можно пожалуйста ещё 2 мелких вопроса?

1. в чём разница между ErrorCode и ResultCode
Если они оба сравниваются только с 0 , то я понимаю
if (ErrorCode <> 0) then // если ошибка то...
if (ResultCode <> 0) then // если успех то...
а если ещё и с единицей, то не вижу разницы

вот напимер форма которая создаётся в пределах создания формы Авторана в случае работающего сервиса Steam

читать дальше »
Код: Выделить весь код
    if (FileExists(AppPath + '\common\half-life 2\hl2.exe') or FileExists(AppPath + '\common\half-life 2 episode one\hl2.exe') or
        FileExists(AppPath + '\common\half-life 2 episode two\hl2.exe') or FileExists(AppPath + '\common\portal\hl2.exe'))
    and (IsProcessRunning('Steam.exe')) then
    
    begin
      MyExit := TForm.Create(nil);
      with MyExit do
      begin
        Position := poScreenCenter;
        BorderStyle := bsDialog;
        ClientWidth := ScaleX(440);
        ClientHeight := ScaleY(180);
        Caption := ExpandConstant(SetupMessage(msgErrorTitle));
        Color := clBtnFace;
        DeleteMenu(GetSystemMenu(MyExit.Handle,False), $F060,0);/// сделать кнопку "закрыть" неактивной
        SetClassLong(MyExit.Handle, -26, GetClassLong(MyExit.Handle, -26) or $200); /// блокировка комбинации alt + f4
        SendMessage(MyExit.Handle, $0080, 0, LoadImage(0,ExpandConstant('{tmp}')+'\icon.ico',1,16,16,$1010)); /// иконка в углу
        OnMouseDown := @MouseDown2;
        with TBitmapImage.Create(MyExit) do
        begin
          Parent := MyExit;
          ExtractTemporaryFile('Pic1.bmp');
          Bitmap.LoadFromFile(ExpandConstant('{tmp}\Pic1.bmp'));
          SetBounds(ScaleX(0), ScaleY(0), ScaleX(440), ScaleY(120));
          OnMouseDown := @MouseDown2;
        end;

        with TLabel.Create(MyExit) do
        begin
          SetBounds(ScaleX(20), ScaleY(131), ScaleX(270), ScaleY(30));
          AutoSize := False;
          Caption := ExpandConstant('{cm:Steam_Runs}');
          Transparent := True;
          WordWrap := True;
          Parent := MyExit;
          Font.Color := clWindowText;
          //Font.Color := $48c1ca;
          Font.Size := 9;
          OnMouseDown := @MouseDown2;
        end;

        with TButton.Create(MyExit) do
        begin
          Caption := ExpandConstant(SetupMessage(msgButtonYes));
          Parent := MyExit;
          SetBounds(ScaleX(270), ScaleY(135), ScaleX(71), ScaleY(25));
          ModalResult := mrYes;
        end;
            
        with TButton.Create(MyExit) do
        begin
          Parent := MyExit;
          Caption := ExpandConstant(SetupMessage(msgButtonNo));
          SetBounds(ScaleX(350), ScaleY(135), ScaleX(71), ScaleY(25));
          ModalResult:= mrNo;
        end;
      end;
    
      ExtractTemporaryFile('launch_deny2.wav');
      sndPlaySound(ExpandConstant('{tmp}\launch_deny2.wav'),$0001);
    
      case
        MyExit.ShowModal() of

        mrNo :
        begin
          PlayInstallButton.Enabled := not IsProcessRunning('Steam.exe');
          MyExit.Free;
        end;

        mrYes :
        begin
          Exec(ExpandConstant('{reg:HKCU\Software\Valve\Steam,SteamPath|}') + '\Steam.exe', '-shutdown', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
          if  not (IsProcessRunning('Steam.exe')) then PlayInstallButton.Enabled := True;
          MyExit.Free;
        end;
      end;
    end;
    
  AutoRun.ShowModal;
       
end;

те если вписать в
Exec(ExpandConstant('{reg:HKCU\Software\Valve\Steam,SteamPath|}') + '\Steam.exe', '-shutdown', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
ErrorCode и сравнить
if (ErrorCode = 0) then MyExit.Free else MsgBox( завршить процесс Да/Нет ...
если я правильно понимаю
(определение процесса взял отсюда http://forum.oszone.net/post-1800689-218.html)

2. достаточно ли завершить процесс так:
Exec('taskkill', '/f /im hl2.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
или лучше воспользоваться библиотекой istask.dll ?

Последний раз редактировалось Johny777, 04-07-2012 в 01:29.


Отправлено: 00:31, 04-07-2012 | #369


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


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

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


El Sanchez,
А как переделать GetProcessWorkingDirectory, чтобы на юникоде работало?

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


Отправлено: 11:20, 04-07-2012 | #370



Компьютерный форум 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




 
Переход