Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

определение родильского PID


Fildy ©   (2008-12-07 15:03:00) 

нужно определить id процесса-родителя, который запустил мое приложение. делается это,чтобы ограничить количество приложений,которые могут запускать мою программу


Riply   (2008-12-07 21:01:00) [1]

> [8] Rouse_ ©   (07.12.08 20:47)
> Саш, ну мы же это уже на исходниках уже обсуждали год назад :)

Значит я не ошиблась в предположении, что кто-то перетрудился.
Побежала отдыхать :)


Rouse_   (2008-12-07 20:47:00) [2]

Саш, ну мы же это уже на исходниках уже обсуждали год назад :)
NtQueryInformationProcess периодически выдает "неверный дескриптор" на псевдохендл :)


Riply   (2008-12-07 19:55:00) [3]

> [6] Rouse_ ©   (07.12.08 19:41)
> На псевдохендл иногда не срабатывает, поэтому вместо него получаю реальный описатель...

А что говорит, когда не срабатывает ?


Rouse_   (2008-12-07 19:41:00) [4]


> А можно разжевать "Пример выполнения" ?
> А то у меня складывается впечатление,
> что кто-то из нас (либо я, либо ты) перетрудился и нуждается
> в отдыхе :)

На псевдохендл иногда не срабатывает, поэтому вместо него получаю реальный описатель...


Сергей М.   (2008-12-07 18:41:00) [5]


> parentID это просто так?


А зачем оно тебе нужно ?
Процесс, который породил твой процесс, на момент получения тобой его PID вполне мог уже благополучно завершиться.


Riply   (2008-12-07 18:37:00) [6]

> [3] Rouse_ ©   (07.12.08 17:43)
> Пример выполнения:

А можно разжевать "Пример выполнения" ?
А то у меня складывается впечатление,
что кто-то из нас (либо я, либо ты) перетрудился и нуждается в отдыхе :)


Rouse_   (2008-12-07 17:43:00) [7]

type
 PROCESS_BASIC_INFORMATION = packed record
   ExitStatus: DWORD;
   PebBaseAddress: Pointer;
   AffinityMask: DWORD;
   BasePriority: DWORD;
   uUniqueProcessId: Ulong;
   uInheritedFromUniqueProcessId: Ulong;
 end;

function  NtQueryInformationProcess(
   ProcessHandle : THandle;
   ProcessInformationClass : Byte;
   ProcessInformation : Pointer;
   ProcessInformationLength : ULONG;
   ReturnLength : PULONG
 ): DWORD; stdcall; external 'ntdll.dll';

function GetOwnedProcessID(const dwProcessHandle: DWORD): DWORD;
const
 ProcessBasicInformation = 0;
var
 Info: PROCESS_BASIC_INFORMATION;
begin
 Result := 0;
 if NtQueryInformationProcess(dwProcessHandle,
   ProcessBasicInformation, @Info, SizeOf(Info), nil) = NO_ERROR then
   Result := Info.uInheritedFromUniqueProcessId;
end;


Пример выполнения:
procedure TForm1.Button1Click(Sender: TObject);
var
 dwProcessHandle: DWORD;
begin
 DuplicateHandle(GetCurrentProcess, GetCurrentProcess, GetCurrentProcess,
   @dwProcessHandle, 0, False, DUPLICATE_SAME_ACCESS);
 Caption := IntToStr(GetOwnedProcessID(dwProcessHandle));
end;


Fildy   (2008-12-07 16:49:00) [8]


> а я всегда считал, что виндоуз запускает...

т.е. в структуре PROCESSENTRY32 такое поле как parentID это просто так?;)
подскажите,как правильно заполнить эту структуру, чтобы в этом поле отображался родительский pid.


KilkennyCat   (2008-12-07 15:50:00) [9]

а я всегда считал, что виндоуз запускает...


Наверх

Титульная страница Поиск, карта сайта Написать письмо