Jump to content
Korean Random
EvilAlex

Создание инсталляторов для модпаков на базе Inno Setup

Recommended Posts

Только что, AtotIK сказал:

Скачивать XFW.ExtensionLib_2021.05.01.zip, брать в архиве файл xvmextensions.x86_32.dll, файл примера там же.

да чет я подключаю он ошибку выдает

 

 

3 минуты назад, AtotIK сказал:

Скачивать XFW.ExtensionLib_2021.05.01.zip, брать в архиве файл xvmextensions.x86_32.dll, файл примера там же.

на это ругается 

Screenshot_4.png.e610bffdb99c2c52da9d2de388c074b5.png

Share this post


Link to post

Short link
Share on other sites
02.10.2021 в 01:19, P.S.Enot сказал:

Ребята кому не сложно  поделитесь кодом который определяет что игра запущена.

 

function IsAppRunning(const FileName : AnsiString): Boolean;
var
  FSWbemLocator: Variant;
  FWMIService : Variant;
  FWbemObjectSet: Variant;
begin
  Result := False;
  FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
  FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
  FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"', [FileName]));
  Result := (FWbemObjectSet.Count > 0);
  FWbemObjectSet := Unassigned;
  FWMIService := Unassigned;
  FSWbemLocator := Unassigned;
end;

function InitializeSetup(): Boolean;
begin
  case IsAppRunning('WorldOfTanks.exe') of
    True: begin MsgBox(ExpandConstant('{cm:IsAppRunningLabel}'), mbError, MB_OK); Result := False; end;
    False: begin Result := True; end;
  end;
end;

 

Работает с Windows 7. Что бы не вылетал с ошибкой инсталлятор на XP и Vista нужно обвернуть это в проверку версии, а лучше запретить инсталлятор запускать на системах ниже Windows 7 (сколько можно уже?).

Так же можно закинуть в NextButtonClick с проверкой на любой странице (первой).

 

07.10.2021 в 15:20, P.S.Enot сказал:

ошибку выдает

Не причастные к друг другу вещи. Ищите ошибку у себя.

Edited by AtotIK

Share this post


Link to post

Short link
Share on other sites
1 минуту назад, AtotIK сказал:

 

function IsAppRunning(const FileName : AnsiString): Boolean;
var
  FSWbemLocator: Variant;
  FWMIService : Variant;
  FWbemObjectSet: Variant;
begin
  Result := False;
  FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
  FWMIService : =FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
  FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"', [FileName]));
  Result := (FWbemObjectSet.Count > 0);
  FWbemObjectSet := Unassigned;
  FWMIService := Unassigned;
  FSWbemLocator := Unassigned;
end;

function InitializeSetup(): Boolean;
begin
  case IsAppRunning('WorldOfTanks.exe') of
    True: begin MsgBox(ExpandConstant('{cm:IsAppRunningLabel}'), mbError, MB_OK); Result:=False; end;
    False: begin RegCheck(); Result:=True; end;
  end;
end;

 

Работает с Windows 7. Что бы не вылетал с ошибкой инсталлятор на XP и Vista нужно обвернуть это в проверку версии, а лучше запретить инсталлятор запускать на системах ниже Windows 7 (сколько можно уже?).

Так же можно закинуть в NextButtonClick с проверкой на любой странице (первой).

у меня виндовс 10

Share this post


Link to post

Short link
Share on other sites
Только что, P.S.Enot сказал:

у меня виндовс 10

 

А у хомячков корч.

Share this post


Link to post

Short link
Share on other sites
1 минуту назад, AtotIK сказал:

 

А у хомячков корч.

интересно сказано. но я не понял не чего )))

Share this post


Link to post

Short link
Share on other sites

А вот универсальный метод, но он сложнее. Работает везде.

 

type HANDLE = LongInt;
     HMODULE = HANDLE;
     pHMODULE = Array[0..255] of HMODULE;
     LPDWORD = DWORD; PDWORD = Array[0..255] of DWORD;
     LPTSTR = String;

function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: Boolean; dwProcessId: DWORD): HANDLE; external '[email protected] stdcall delayload';
function CloseHandle(hObject: HANDLE): BOOL; external '[email protected] stdcall delayload';
function EnumProcesses(var pProcessIds: PDWORD; cb: DWORD; var pBytesReturned: DWORD): BOOL; external '[email protected] stdcall delayload';
function EnumProcessModules(hProcess: HANDLE; var lphModule: pHMODULE; cb: DWORD; var lpcbNeeded: LPDWORD): BOOL; external '[email protected] stdcall delayload';
function GetModuleFileNameExW(hProcess: HANDLE; hModule: HMODULE; lpFilename: LPTSTR; nSize: DWORD): DWORD; external '[email protected] stdcall delayload';

function IsAppRunning(procName: String; FullPath: Boolean): Boolean;
var
  Found, isModuleShot: Boolean;
  FilenameEnd: Integer;
  Filename: AnsiString;
  NA, Entry, maxEntries: DWORD;
  Processes: PDWORD;
  lpFilename: LPTSTR;
  hProcess: HANDLE;
  hMod: pHMODULE;
begin
  SetLength(lpFilename, 255);
  Found := False;
  if (EnumProcesses(Processes, SizeOf(Processes), maxEntries)) then
  begin
    Entry := 0;
    maxEntries := maxEntries / SizeOf(maxEntries);
    while ((not Found) and (Entry < maxEntries)) do
    begin
      hProcess := OpenProcess($400 or $10, False, Processes[Entry]);
      if (hProcess <> 0) then
      begin
        isModuleShot := False;
        begin
          isModuleShot := EnumProcessModules(hProcess, hMod, SizeOf(hMod), NA);
        end;
        if (isModuleShot) then
        if (GetModuleFileNameExW(hProcess, hMod[0], lpFilename, Length(lpFilename)) > 0) then
        begin
          FilenameEnd := Pos(#0, lpFilename);
          Filename := Copy(Lowercase(lpFilename), 1, FilenameEnd - 1);
          if (not Fullpath) then
            Filename := ExtractFileName(Filename);
          if (AnsiLowercase(Filename) = AnsiLowercase(procName)) then
            Found := True;
        end;
        CloseHandle(hProcess);
      end;
      Entry := Entry + 1;
    end;
  end;
  Result := Found;
end;

function NextButtonClick(CurPage: Integer): Boolean;
begin
  Result := True;
  if CurPage = 1 then
  begin
    case IsAppRunning('WorldOfTanks.exe', False) of
      True: begin MsgBox(ExpandConstant('{cm:IsAppRunningLabel}'), mbError, MB_OK); Result := False; end;
      False: Result := True;
    end;
  end;
end;

 

2 минуты назад, P.S.Enot сказал:

интересно сказано. но я не понял не чего )))

Тогда может это не твоё?

Edited by AtotIK

Share this post


Link to post

Short link
Share on other sites
1 минуту назад, AtotIK сказал:

А вот универсальный метод, но он сложнее. Работает везде.

 

type HANDLE = LongInt;
     HMODULE = HANDLE;
     pHMODULE = Array[0..255] of HMODULE;
     LPDWORD = DWORD; PDWORD = Array[0..255] of DWORD;
     LPTSTR = String;

function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: Boolean; dwProcessId: DWORD): HANDLE; external '[email protected] stdcall delayload';
function CloseHandle(hObject: HANDLE): BOOL; external '[email protected] stdcall delayload';
function EnumProcesses(var pProcessIds: PDWORD; cb: DWORD; var pBytesReturned: DWORD): BOOL; external '[email protected] stdcall delayload';
function EnumProcessModules(hProcess: HANDLE; var lphModule: pHMODULE; cb: DWORD; var lpcbNeeded: LPDWORD): BOOL; external '[email protected] stdcall delayload';
function GetModuleFileNameExW(hProcess: HANDLE; hModule: HMODULE; lpFilename: LPTSTR; nSize: DWORD): DWORD; external '[email protected] stdcall delayload';

function IsAppRunning(procName: String; FullPath: Boolean): Boolean;
var
  Found, isModuleShot: Boolean;
  FilenameEnd: Integer;
  Filename: AnsiString;
  NA, Entry, maxEntries: DWORD;
  Processes: PDWORD;
  lpFilename: LPTSTR;
  hProcess: HANDLE;
  hMod: pHMODULE;
begin
  SetLength(lpFilename, 255);
  Found := False;
  if (EnumProcesses(Processes, SizeOf(Processes), maxEntries)) then
  begin
    Entry := 0;
    maxEntries := maxEntries / SizeOf(maxEntries);
    while ((not Found) and (Entry < maxEntries)) do
    begin
      hProcess := OpenProcess($400 or $10, False, Processes[Entry]);
      if (hProcess <> 0) then
      begin
        isModuleShot := False;
        begin
          isModuleShot := EnumProcessModules(hProcess, hMod, SizeOf(hMod), NA);
        end;
        if (isModuleShot) then
        if (GetModuleFileNameExW(hProcess, hMod[0], lpFilename, Length(lpFilename)) > 0) then
        begin
          FilenameEnd := Pos(#0, lpFilename);
          Filename := Copy(Lowercase(lpFilename), 1, FilenameEnd - 1);
          if (not Fullpath) then
            Filename := ExtractFileName(Filename);
          if (AnsiLowercase(Filename) = AnsiLowercase(procName)) then
            Found := True;
        end;
        CloseHandle(hProcess);
      end;
      Entry := Entry + 1;
    end;
  end;
  Result := Found;
end;

function NextButtonClick(CurPage: Integer): Boolean;
var
  VersionString, FilePath: String;
begin
  Result := True;
  if CurPage = 1 then
  begin
    case IsAppRunning('WorldOfTanks.exe', False) of
      True: begin MsgBox(ExpandConstant('{cm:IsAppRunningLabel}'), mbError, MB_OK); Result := False; end;
      False: Result := True;
    end;
  end;
end;

 

Тогда может это не твоё?

не просто нужно что бы кто то помог с овсем разобраться для понимания и все будет нормально у же потом . москва не сразу строилась

2 минуты назад, AtotIK сказал:

А вот универсальный метод, но он сложнее. Работает везде.

 

type HANDLE = LongInt;
     HMODULE = HANDLE;
     pHMODULE = Array[0..255] of HMODULE;
     LPDWORD = DWORD; PDWORD = Array[0..255] of DWORD;
     LPTSTR = String;

function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: Boolean; dwProcessId: DWORD): HANDLE; external '[email protected] stdcall delayload';
function CloseHandle(hObject: HANDLE): BOOL; external '[email protected] stdcall delayload';
function EnumProcesses(var pProcessIds: PDWORD; cb: DWORD; var pBytesReturned: DWORD): BOOL; external '[email protected] stdcall delayload';
function EnumProcessModules(hProcess: HANDLE; var lphModule: pHMODULE; cb: DWORD; var lpcbNeeded: LPDWORD): BOOL; external '[email protected] stdcall delayload';
function GetModuleFileNameExW(hProcess: HANDLE; hModule: HMODULE; lpFilename: LPTSTR; nSize: DWORD): DWORD; external '[email protected] stdcall delayload';

function IsAppRunning(procName: String; FullPath: Boolean): Boolean;
var
  Found, isModuleShot: Boolean;
  FilenameEnd: Integer;
  Filename: AnsiString;
  NA, Entry, maxEntries: DWORD;
  Processes: PDWORD;
  lpFilename: LPTSTR;
  hProcess: HANDLE;
  hMod: pHMODULE;
begin
  SetLength(lpFilename, 255);
  Found := False;
  if (EnumProcesses(Processes, SizeOf(Processes), maxEntries)) then
  begin
    Entry := 0;
    maxEntries := maxEntries / SizeOf(maxEntries);
    while ((not Found) and (Entry < maxEntries)) do
    begin
      hProcess := OpenProcess($400 or $10, False, Processes[Entry]);
      if (hProcess <> 0) then
      begin
        isModuleShot := False;
        begin
          isModuleShot := EnumProcessModules(hProcess, hMod, SizeOf(hMod), NA);
        end;
        if (isModuleShot) then
        if (GetModuleFileNameExW(hProcess, hMod[0], lpFilename, Length(lpFilename)) > 0) then
        begin
          FilenameEnd := Pos(#0, lpFilename);
          Filename := Copy(Lowercase(lpFilename), 1, FilenameEnd - 1);
          if (not Fullpath) then
            Filename := ExtractFileName(Filename);
          if (AnsiLowercase(Filename) = AnsiLowercase(procName)) then
            Found := True;
        end;
        CloseHandle(hProcess);
      end;
      Entry := Entry + 1;
    end;
  end;
  Result := Found;
end;

function NextButtonClick(CurPage: Integer): Boolean;
var
  VersionString, FilePath: String;
begin
  Result := True;
  if CurPage = 1 then
  begin
    case IsAppRunning('WorldOfTanks.exe', False) of
      True: begin MsgBox(ExpandConstant('{cm:IsAppRunningLabel}'), mbError, MB_OK); Result := False; end;
      False: Result := True;
    end;
  end;
end;

 

Тогда может это не твоё?

Screenshot_6.png.c6c3aa3c41297cdfc1ac98e5194a9c0b.png

 

Share this post


Link to post

Short link
Share on other sites
17 часов назад, P.S.Enot сказал:

не просто нужно что бы кто то помог с овсем разобраться для понимания и все будет нормально у же потом . москва не сразу строилась

 

: =

замени на

:=

Share this post


Link to post

Short link
Share on other sites
25 минут назад, AtotIK сказал:

: =

замени на

:=

наладил . спасибо 

Share this post


Link to post

Short link
Share on other sites

При перекомпиляции с недавних пор начало выскакивать такое окошко((( приходится перезагружать комп((

Может кто знает как вылечить?((

2021-10-13_104440.png.b3e854c464b690abf735eed2d9116752.png

Share this post


Link to post

Short link
Share on other sites
10 hours ago, DraugDM said:

При перекомпиляции с недавних пор начало выскакивать такое окошко((( приходится перезагружать комп((

Может кто знает как вылечить?((

Ну. Это значит, что существующий скомпилированный *.exe-файл занят каким-то процессом, обрабатывающим его.

  • После первой компиляции инсталлятор запускался? Если да, вероятнее всего, он неправильно завершается и попросту зависает в процессах. Нужно мониторить диспетчер задач. Смотреть DeinitializeSetup.
  • После компиляции инсталлятор не запускался, просто была начата повторная компиляция? Если да, то занести директорию проекта в исключения любых антивирусных ПО.
Edited by Kotyarko_O
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
17 часов назад, Kotyarko_O сказал:

Ну. Это значит, что существующий скомпилированный *.exe-файл занят каким-то процессом, обрабатывающим его.

  • После первой компиляции инсталлятор запускался? Если да, вероятнее всего, он неправильно завершается и попросту зависает в процессах. Нужно мониторить диспетчер задач. Смотреть DeinitializeSetup.
  • После компиляции инсталлятор не запускался, просто была начата повторная компиляция? Если да, то занести директорию проекта в исключения любых антивирусных ПО.

спс за ответ!

Только что еще раз компилировал установщик, установил моды... завершил процесс установки! Удалил установщик, компилировал новый и тут же при начале установке это окно! (( в диспетчере задач DeinitializeSetup нет(

Думаю скорее всего дело в коде на поиск клиента на дисках...

2021-10-14_161824.thumb.png.ec20f3f7ec93dfae04433f3bfcc4777f.png

Share this post


Link to post

Short link
Share on other sites
7 hours ago, DraugDM said:

в диспетчере задач DeinitializeSetup нет

У меня про это были два разных предложения. "DeinitializeSetup" - функция в скрипте, в диспетчере быть не может. Нужно смотреть саму функцию и определять, что в ней неправильное\чего не хватает, на основе используемых библиотек, например.

 

7 hours ago, DraugDM said:

установил моды... завершил процесс установки! Удалил установщик, компилировал новый и тут же при начале установке это окно!

Тогда смотри в сторону антивирусного ПО.

 

7 hours ago, DraugDM said:

Думаю скорее всего дело в коде на поиск клиента на дисках.

Эта ошибка не говорит о проблемах в коде.

Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...