Функции GetProcessID и GetThreadID, как ни странно, возвращают одинаковое значение N, а результатах работы программы tasklist (штатная команда Windows) я вижу совершенно иные значения PID для запущенной задачи
Номера процессов (PID) запущенной программы и ее родителя
Модератор: Модераторы
Номера процессов (PID) запущенной программы и ее родителя
Уважаемые форумчане, автоматизируя рабочие задачи, столкнулся с задачей как программе узнать свой PID и PID своего родителя (платформа Win32)...
Функции GetProcessID и GetThreadID, как ни странно, возвращают одинаковое значение N, а результатах работы программы tasklist (штатная команда Windows) я вижу совершенно иные значения PID для запущенной задачи
Функции GetProcessID и GetThreadID, как ни странно, возвращают одинаковое значение N, а результатах работы программы tasklist (штатная команда Windows) я вижу совершенно иные значения PID для запущенной задачи
Может ты не от админа запускаешь?
попробуй такой код:
попробуй такой код:
Код: Выделить всё
{$mode delphi}{$H+}
uses
Windows, jwatlhelp32;
function GetProcessID(AHandle: HANDLE): DWORD; stdcall; external 'kernel32.dll' name 'GetProcessId';
var
h : DWORD;
res: TProcessEntry32W;
ws : WideString;
pid : DWORD;
begin
pid:=GetCurrentProcessId;
writeln('My PID: ',pid);
writeln('My PID by GetProcess: ',GetProcessID(GetCurrentProcess));
h:=CreateToolhelp32Snapshot(TH32CS_SNAPALL, GetCurrentProcessId);
FillChar(res, sizeof(res),0);
res.dwSize:=sizeof(res);
if Process32FirstW(h, res) then begin
if (res.th32ProcessID<>pid) then
repeat
until (res.th32ProcessID=pid) or not Process32NextW(h, res);
if res.th32ProcessID=pid then
writeln('My Parent PID: ', res.th32ParentProcessID)
else
writeln('failed to find my parent!');
end else
writeln('failed to find my parent!');
CloseHandle(h);
writeln('Hit enter or open Task Manager to compare values!');
readln;
end.
Огромное спасибо! 
-
alex208210
- постоялец
- Сообщения: 207
- Зарегистрирован: 12.05.2010 13:16:51
неправильно закрыт Toolhelp32Snapshot. Будет утечка памяти.
alex208210 писал(а):неправильно закрыт Toolhelp32Snapshot. Будет утечка памяти.
как правильно?
-
alex208210
- постоялец
- Сообщения: 207
- Зарегистрирован: 12.05.2010 13:16:51
Toolhelp32Snapshot нужно закрывать CloseToolhelp32Snapshot(h);
alex208210 писал(а):Toolhelp32Snapshot нужно закрывать CloseToolhelp32Snapshot(h);
судя по всему CloseToolhelp32Snapshot есть только в Windows CE (Mobile).
Тогда как в WinAPI наборе такой функции нет. И согласно документации CreateToolhelp32Snapshot, её результат должен быть закрыт именно CloseHandle().
Проверка на практике (см приложение), доказывает это.
- Вложения
-
- close.png (7.09 КБ) 27258 просмотров
-
alex208210
- постоялец
- Сообщения: 207
- Зарегистрирован: 12.05.2010 13:16:51
проблему с утечкой памяти обнаружил именно в wince, на больших виндах не проверял, тогда точно утверждать не буду.
alex208210 писал(а):проблему с утечкой памяти обнаружил именно в wince, на больших виндах не проверял, тогда точно утверждать не буду.
для кроссплатформенности, добавь такой вот заголовок:
Код: Выделить всё
function CloseToolhelp32Snapshot(AHandle: HANDLE): LongBool; stdcall; external 'kernel32.dll' name 'CloseHandle';
но $IFDEF-ы не забудь!
Всем спасибо! Вопрос решен 
В результате получилась прелестная утилита командной строки для вставления оной в батники с поддержкой многопоточности
В результате получилась прелестная утилита командной строки для вставления оной в батники с поддержкой многопоточности
