Определите родительский процесс текущего приложения

Необходимо предпочесть внешнюю версию по внутренней версии. Это - просто определенная версия правила, переместите что-либо вне цикла, который можно переместить вне цикла. В зависимости от компилятора IL и JIT-компилятора Ваши две версии могут или не могут закончиться с различными рабочими характеристиками.

На другой ноте необходимо, вероятно, посмотреть на плавание. TryParse или Преобразовывают. ToFloat.

8
задан Mason Wheeler 7 December 2009 в 01:50
поделиться

5 ответов

Вы можете использовать функцию CreateToolhelp32Snapshot для перечисления списка запущенных процессов, а затем функцию Process32First , чтобы получить th32ParentProcessID , который является идентификатором процесса, который создал этот процесс (его родительский процесс).

См. этот пример.

uses
  Psapi,
  Windows,
  tlhelp32,
  SysUtils;

function GetTheParentProcessFileName(): String;
const
  BufferSize = 4096;
var
  HandleSnapShot  : THandle;
  EntryParentProc : TProcessEntry32;
  CurrentProcessId: DWORD;
  HandleParentProc: THandle;
  ParentProcessId : DWORD;
  ParentProcessFound  : Boolean;
  ParentProcPath      : String;

begin
  ParentProcessFound := False;
  HandleSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   //enumerate the process
  if HandleSnapShot <> INVALID_HANDLE_VALUE then
  begin
    EntryParentProc.dwSize := SizeOf(EntryParentProc);
    if Process32First(HandleSnapShot, EntryParentProc) then    //find the first process
    begin
      CurrentProcessId := GetCurrentProcessId(); //get the id of the current process
      repeat
        if EntryParentProc.th32ProcessID = CurrentProcessId then
        begin
          ParentProcessId := EntryParentProc.th32ParentProcessID; //get the id of the parent process
          HandleParentProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ParentProcessId);
          if HandleParentProc <> 0 then
          begin
              ParentProcessFound := True;
              SetLength(ParentProcPath, BufferSize);
              GetModuleFileNameEx(HandleParentProc, 0, PChar(ParentProcPath),BufferSize);
              ParentProcPath := PChar(ParentProcPath);
              CloseHandle(HandleParentProc);
          end;
          break;
        end;
      until not Process32Next(HandleSnapShot, EntryParentProc);
    end;
    CloseHandle(HandleSnapShot);
  end;

  if ParentProcessFound then
    Result := ParentProcPath
  else
    Result := '';
end;
9
ответ дан 5 December 2019 в 10:42
поделиться

Я бы добавил дополнительный параметр, о котором вы знаете только (это может быть guid), если этот guid не является частью параметров, переданных вашей утилите .. Немедленно завершите приложение.

2
ответ дан 5 December 2019 в 10:42
поделиться

Быстрый ответ на ваш вопрос: «Нет, вы не можете предотвратить выполнение приложения». Если это исполняемый файл, то его можно запустить. Это невозможно остановить.

И, если вы не можете управлять приложением (как, кажется, указывают ваши комментарии), тогда отличное предложение Джи не сработает, верно? У вас нет возможности контролировать то, что делает приложение, и вы не можете контролировать его реакцию на вашу специальную командную строку.

Это действительно интересная ситуация.

Единственный способ обойти это - полностью запретить доступ к EXE или, по крайней мере, затруднить его поиск.

Вы можете сделать следующее:

  1. Встроить EXE в EXE хоста в качестве ресурса
  2. Когда придет время запустить EXE,
2
ответ дан 5 December 2019 в 10:42
поделиться

Мы используем довольно простой метод, который требует всего несколько строк кода. Родительское приложение и служебное приложение используют некоторые общие строки GUIID (в коде) и вызывают RegisterWindowMessage, чтобы создать своего рода протокол рукопожатия «Hello». Это сообщение публикуется при первом запуске служебного приложения. Если родительское приложение запущено и запустило утилиту, оно отправляет ответное сообщение, которое утилита видит, и все в порядке. В противном случае утилита завершает работу и завершает работу.

2
ответ дан 5 December 2019 в 10:42
поделиться

Если это приложение запускается только изнутри хоста, почему бы просто не включить формы для этого приложения в главное приложение и не активировать его, как другую форму?

1
ответ дан 5 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: