Jump to content

meoit

Members
  • Posts

    0
  • Joined

  • Last visited

Reputation Activity

  1. Like
    meoit reacted to Yaliang in [inno setup]Check app(*.exe) is running in Code section   
    There are some ways to do this. Such as using a external DLL.But I do not like this way.
    The Inno surport Pascal script. The Pascal script can call standard Win32 API functions inside standard Windows DLLs. So we can check the app is whether running.
    Here is a part of script in
    section:; Any question, let me know.
    ;It work on 32 and 64 modules!
    [code]
    type HANDLE = LongInt;
    HMODULE = HANDLE;
    pHMODULE = Array[0..255] of HMODULE;
    LPDWORD = DWORD; PDWORD = Array[0..255] of DWORD;
    LPTSTR = String;
    const PROCESS_QUERY_INFORMATION = $400;
    PROCESS_VM_READ = $10;
    MAX_LENGTH = 255;
    function OpenProcess(dwDesiredAccess : DWORD; bInheritHandle : Boolean; dwProcessId : DWORD) : HANDLE;
    external 'OpenProcess@kernel32.dll stdcall delayload';
    function CloseHandle(hObject : HANDLE) : BOOL;
    external 'CloseHandle@kernel32.dll stdcall delayload';
    function EnumProcesses(var pProcessIds : PDWORD; cb : DWORD; var pBytesReturned : DWORD) : BOOL;
    external 'EnumProcesses@psapi.dll stdcall delayload';
    //notice:delayload EnumProcessModules and EnumProcessModulesEx functions
    //64-bit using EnumProcessModulesEx; 32-bite using EnumProcessModules
     
    function EnumProcessModulesEx(hProcess : HANDLE; var lphModule : pHMODULE; cb : DWORD; var lpcbNeeded : LPDWORD; dwFilterFlag : DWORD) : BOOL;
    external 'EnumProcessModulesEx@psapi.dll stdcall delayload';function EnumProcessModules(hProcess : HANDLE; var lphModule : pHMODULE; cb : DWORD; var lpcbNeeded : LPDWORD) : BOOL;
    external 'EnumProcessModules@psapi.dll stdcall delayload';
    function GetModuleFileNameExW(hProcess : HANDLE; hModule : HMODULE; lpFilename : LPTSTR; nSize : DWORD) : DWORD;
    external 'GetModuleFileNameExW@psapi.dll stdcall delayload';
    //here is the functionfunction
    zylIsAppRunning(procName : String; fullPath : Boolean) : Boolean;
    var found : Boolean;
    filenameEnd : Integer;
    filename : String;
    NA : DWORD;
    entry : DWORD;
    maxEntries : DWORD;
    processes : PDWORD;
    lpFilename : LPTSTR;
    hProcess : HANDLE;
    hMod : pHMODULE;
    isModuleShot: Boolean;
    begin
    SetLength(lpFilename, MAX_LENGTH);
    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(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, processes[entry]);
    if (hProcess <> 0) then
    begin
    isModuleShot := False;
    if IsWin64 then
    begin //EnumProcessModulesEx @param $3,surport 32-bit modules and 64-bit modules the sametiem
    isModuleShot := EnumProcessModulesEx(hProcess, hMod, SizeOf(hMod), NA, $3);
    end else 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 end
     
    How to use:
    I wish you have installed the Unicode Inno Setup (the 5.5.x version or more).(If not, you can download it from the home page http://www.jrsoftware.org)
    You can use it where you need just like:zylIsAppRunning('notdpad.exe', false);
    An example project for Unicode Inno Setup is provided as download.

    The attachment "CheckAppRunning.zip" is the script.
    Unzip the file CheckAppRunning.zip,
    you can get a file named "CheckAppRunning.iss".
    Please copy the *.iss files to the directory: ./Inno Setup 5/Examples
    Then build the program and run it.
    CheckAppRunning.zip
×
×
  • Create New...