Внешний вид сайта:

Приложение запущено из Delphi?

Как узнать, запущено ли приложение из Delphi, либо запущено самостоятельно?
  • Использовать CreateToolHelp32SnapShot, чтобы получить список всех запущенных процессов
  • Цикл через список (используя функции API Process32First и Process32Next) для поиска нашего процесса. После того, как мы найдем структуру нашего приложения, она будет содержать ID родительского процесса
  • Цикл по списку, используя те же самые функции API для поиска процесса, котороый соответствует найденному ID

Когда найдем родительский процесс, проверим имя этого процесса. Если это Delphi32.exe, то программа запущена в отладчике, если нет, то нет.

var 
   lclCurrProc: TProcessEntry32; 
   lclPrntProc: TProcessEntry32; 
   lclSnapHndl: THandle; 
   lclEXEName: String; 
   lclPrntName: String; 

begin 
    // Получить текущий список процессов
    lclSnapHndl := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0); 

    // Сохраним имя экзешника
    lclEXEName := ExtractFileName(Application.ExeName); 

    // Нужно определить размер этих структур
    lclCurrProc.dwSize := SizeOf(TProcessEntry32); 
    lclPrntProc.dwSize := SizeOf(TProcessEntry32); 


    // Ищем текущие процессы
    Process32First(lclSnapHndl, lclCurrProc); 
    repeat 
      if lclCurrProc.szExeFile = lclEXEName then 
        Break; 
    until (not Process32Next(lclSnapHndl, lclCurrProc)); 


    // Ищем родительские процессы
    Process32First(lclSnapHndl, lclPrntProc); 
    repeat 
      if lclPrntProc.th32ProcessID = lclCurrProc.th32ParentProcessID then 
        Break; 
    until (not Process32Next(lclSnapHndl, lclPrntProc)); 


    lclPrntName := lclPrntProc.szExeFile; 
    if AnsiCompareText(lclPrntName, 'Delphi32.exe') = 0 then 
      ShowMessage('Из Delphi') 
    else 
      ShowMessage('НЕ из Delphi'); 

Поместите TLhelp32 в секцию uses.

Имейте ввиду, что при работе с Borland Developer Studio это будет файл BDS.exe.

Комментарии

Нет комментариев. Ваш будет первым!