Форум: "WinAPI";
Текущий архив: 2016.04.24;
Скачать: [xml.tar.bz2];
ВнизПроверить существование родительского процесса Найти похожие ветки
← →
lexi (2010-06-19 16:12) [0]Подскажите как можно это сделать? На ум приходит разве что проверка времени..
Сам родительский процесс ищется стандартно, через CreateToolhelp32Snapshot и th32ParentProcessID
← →
sniknik © (2010-06-19 18:26) [1]> Сам родительский процесс ищется стандартно ...
т.е. найти свой по текущему id и вытащить из информации о нем id родителя проблем не представляет, а вот попытаться найти по вытащенному id процесс и посмотреть находит его или нет проблема? ... жуть, и вам хватает наглости писать в винапи, а не в начинающие.
← →
[true]trix © (2010-06-19 18:54) [2]Что-то типа того, погугри инет по этому коду.
function GetProcessModules(hWind:thandle;ProcName : String;
FullPath : Boolean;
IncludeData : Boolean) : TStringList;
var
s : String;
Found : Boolean;
Done : Boolean;
AList : TStringList;
ProcHandle : THandle;
ModHandle : THandle;
AProcEntry : TProcessEntry32;
AModEntry : TModuleEntry32;
begin
AList := TStringList.Create;
Result := AList;
AList.Sorted := True;
ProcHandle := CreateToolHelp32Snapshot
(TH32CS_SNAPALL, 0);
if ProcHandle = -1 then Exit;
AProcEntry.dwSize := sizeof(TProcessEntry32);
AModEntry.dwSize := sizeof(TModuleEntry32);
if Process32First(ProcHandle, AProcEntry)
then begin
{ Просматриваем процессы, пока не будет
найдено совпадение http://www.chipdisk.ru }
Found :=
UpperCase(AProcEntry.szExeFile) =
UpperCase(ProcName);
if not Found
then repeat
Done := not Process32Next(ProcHandle, AProcEntry);
if not Done
then Found := UpperCase(AProcEntry.szExeFile) =
UpperCase(ProcName);
until Done or Found;
if Found
then begin
ModHandle :=
CreateToolHelp32Snapshot(TH32CS_SNAPMODULE,
AProcEntry.th32ProcessID);
if Module32First(ModHandle, AModEntry)
then begin
{ Обработка первого модуля первого http://byteme.ru процесса }
if IncludeData
then s := "" +
IntToStr(AModEntry.GlblcntUsage)
else s := "";
if FullPath
then s := AModEntry.szExePath + s
else s := AModEntry.szModule + s;
AList.Add(s);
{ Обработка остальных модулей
первого процесса }
while Module32Next(ModHandle, AModEntry) do
begin
if IncludeData
then s := "" +
IntToStr(AModEntry.GlblcntUsage)
else s := "";
if FullPath
then s := AModEntry.szExePath + s
else s := AModEntry.szModule + s;
AList.Add(s);
writeln(s);
end;
end;
CloseHandle(ModHandle);
end;
end;
CloseHandle(ProcHandle);
end;
← →
lexi (2010-06-19 20:12) [3]@sniknik
Насколько я помню, Id не уникальны. И после закрытия родительского процесса этот Id может оказаться у другого, нового процесса.
← →
lexi (2010-06-19 20:22) [4]@[true]trix
Ok, буду проверять ещё и по имени. Спасибо.
← →
sniknik © (2010-06-20 11:07) [5]> Id не уникальны.
не уникальны... в общем. но в частности не выдается дубль используемого, т.к. иначе не возможно будет построить правильно дерево процессов. а оно системой используется. ну, это насколько я помню.
> И после закрытия родительского процесса этот Id может оказаться у другого, нового процесса.
не может, т.к. занят системой, вот когда ты и свою закроешь и освободишь его, тогда пожалуйста...
> Ok, буду проверять ещё и по имени. Спасибо.
данный пример не рабочий в 64битной среде. так для информации.
← →
Посторонний (2010-06-20 16:29) [6]
> а оно системой используется.
не используется
← →
sniknik © (2010-06-20 16:46) [7]> не используется
зачем голословные утверждения? просто приведи пример дубля id процесса выделенного системой до того как освободится старый. и все, спор умрет не родившись.
← →
Посторонний (2010-06-20 17:49) [8]sniknik © (20.06.10 16:46) [7]
То, что дерево не используется, не влечет за собой дублирования ID процессов. Читай уже Соломона с Руссиновичем
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2016.04.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c