![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
определение родильского 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]а я всегда считал, что виндоуз запускает...