Как узнать, запущено ли приложение из 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.
По материалам http://delphi.3000.com
|