![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ID процеса по его имени [D7, WinXP]
1236434 © (2005-08-26 01:08:00)Банальный вопрос.
как получить ID процесса зная только его имя.
Видимого окна нету, потому FindWindow не поможет.
psa247 (2005-08-31 09:53:00) [1]Так попробовал - тоже ерунда вылезает...
function GetProcessCPUUsage(PID : Cardinal; KernelTime, UserTime : LARGE_INTEGER): integer;
var i : integer;
LoDWORD, HiDWORD : DWORD;
tmp : real;
Time : Cardinal;
begin
Result:= 0;
if ProcessTimersCount > 0 then
for i:= 0 to ProcessTimersCount -1 do
if ProcessTimers[i].PID = PID then begin
HiDWORD:= KernelTime.HighPart - ProcessTimers[i].KernelTime.HighPart;
LoDWORD:= KernelTime.LowPart - ProcessTimers[i].KernelTime.LowPart;
tmp:= LoDWORD + HiDWORD * DWORD(-1);
Time:= GetTickCount;// - ProcessTimers[i].Time;
Result:= Round(tmp / Time);
// if PID = 0 then Result:= Result - 100;
ProcessTimers[i].KernelTime:= KernelTime;
ProcessTimers[i].UserTime:= UserTime;
ProcessTimers[i].Time:= Time;
exit;
end;
Inc(ProcessTimersCount);
SetLength(ProcessTimers, ProcessTimersCount);
ProcessTimers[ProcessTimersCount -1].PID:= PID;
ProcessTimers[ProcessTimersCount -1].KernelTime:= KernelTime;
ProcessTimers[ProcessTimersCount -1].UserTime:= UserTime;
ProcessTimers[ProcessTimersCount -1].Time:= GetTickCount;
end;
Rouse_ (2005-08-29 17:36:00) [2]> psa247 © (29.08.05 14:56) [16]
Согласен :)
psa247 (2005-08-29 14:56:00) [3]
> Rouse_ ©
Александр, так будет лучше:
Result:= round(100 * Tmp / (Time - ProcessTimers[I].Time));
а здесь - черт его знает, алгоритм, вроде бы правильный...
while Result > 100 do Dec(Result, 100);
alpet (2005-08-26 19:48:00) [4]Примерное подобие для PSAPI.
program pskill;
{$APPTYPE CONSOLE}
uses
Windows;
type
TProcessDesc = record
pid: DWORD;
sModuleName: string;
end; // TProcessDesc
TProcessList = class
list: array of TProcessDesc;
size: dword;
private
procedure AddProcess (hProcess, PID: DWORD);
public
count: dword;
constructor Create;
destructor Destroy; override;
procedure EnumProcess;
end;
{ TProcessList }
constructor TProcessList.Create;
begin
size := 256;
count := 0;
SetLength (list, size);
end; // Create
destructor TProcessList.Destroy;
begin
SetLength (list, 0);
size := 0;
count := 0;
end; // destroy
procedure TProcessList.EnumProcess;
var n: dword;
h: THandle;
begin
count := 0;
n := $4;
if true then
repeat
SetLastError (0); // PROCESS_ALL_ACCESS
h := OpenProcess (PROCESS_QUERY_INFORMATION or
PROCESS_VM_READ, false, n); // from some id
if h <> 0 then
begin AddProcess (h, n); CloseHandle (h); end;
inc (n, 4);
until n = 65536;
end; // EnumProcess
var
GetModuleFileNameEx: function ( hProcess, hModule : THandle;
lpFilename: PWideChar; nSize: DWORD): DWORD; stdcall = nil;
procedure TProcessList.AddProcess;
var temp: array [0..256] of WideChar;
begin
if (count = size) then
begin
inc (size, 256);
SetLength (list, size);
end;
inc (count);
list [count].pid := pid;
temp [0] := #0;
FillChar (temp, sizeof (temp), 0);
if Assigned (GetModuleFileNameEx) then
if GetModuleFileNameEx (hProcess, hInstance, @temp, 256) = 0 then
list [count].sModuleName := '<system>'
else
list [count].sModuleName := pwidechar (@temp)
end; // AddProcess
var pslist: TProcessList;
n: dword;
hLib: THandle;
begin
hLib := LoadLibrary ('psapi.dll');
if hLib <> 0 then @GetModuleFileNameEx := GetProcAddress (hLib, 'GetModuleFileNameExW');
pslist := TProcessList.Create;
pslist.EnumProcess;
for n := 1 to pslist.count do
with pslist do
Writeln (list [n].pid, ' ', list [n].sModuleName);
readln;
pslist.Free;
end.
Джо (2005-08-26 19:37:00) [5]
> [13] alpet © (26.08.05 19:30)
Теперь понял, спасибо, что объяснил :)
Прошу извинить резкий тон. Исключительно из-за недопонимания.
alpet (2005-08-26 19:30:00) [6]Джо © (26.08.05 14:45) [12]
Сорри, если ты принял пост [6] на свой счет, который я отнес на самом деле к посту [4]. Не очень хороший совет, дал автору сабжа тот кто посоветовал "начать со сложного и с системы".
По сабжу же способ не вызывает нареканий (ибо классика).
Джо (2005-08-26 14:45:00) [7]
> [6] alpet © (26.08.05 07:43)
> 1236434 (26.08.05 03:47) [4]
>
> Советчики небось сами не поняли, чего посоветовали, и зачем.
Советчики, или, если точнее, советчик, прекрасно понял то, что сам посоветовал. Если под "именем процесса" понимать имя исполнимого файла (а я это специально уточнил в [1] и автор вопроса согласился с таким толкованием), то код, приведенный в [3], как раз и иллюстрирует перечисление PID процессов и имен исполнимых файлов, соответствующих этим PID'ам.
Насчет, того, зачемя это посоветовал я тоже прекрасно осведомлен. Совет я свой давал до признания в [4].
---
Кстати, я оговорил, что свой код я не считаю единственно правильным подходом. И уж если остальные советчики считают нужным говорить о его неправильности, то было бы чудесно увидеть их работающий вариант.
Rouse_ (2005-08-26 12:05:00) [8]> Диспетчер задач пишу
Изучай: http://rouse.front.ru/taskmon.zip
Leonid Troyanovsky (2005-08-26 11:59:00) [9]
> Игорь Шевченко © (26.08.05 11:51) [9]
> Тогда задача нерешаема, потому что процессов с одним именем
> может быть несколько.
Почему не решаема?
Просто, может не иметь единственное решение.
--
Regards, LVT.
Игорь Шевченко (2005-08-26 11:51:00) [10]Leonid Troyanovsky © (26.08.05 11:40) [8]
Тогда задача нерешаема, потому что процессов с одним именем может быть несколько.
Leonid Troyanovsky (2005-08-26 11:40:00) [11]
> Игорь Шевченко © (26.08.05 10:07) [7]
> А что такое "имя процесса" ?
Наверное, то, что возвращает NTQuerySystemInformation -
там есть такое, в структуре ProcessInfo (как ее повелось называть).
--
Regards, LVT.
Игорь Шевченко (2005-08-26 10:07:00) [12]
> как получить ID процесса зная только его имя.
А что такое "имя процесса" ?
alpet (2005-08-26 07:43:00) [13]1236434 (26.08.05 03:47) [4]
Советчики небось сами не поняли, чего посоветовали, и зачем. Чтобы начать, нужно сначала простое изучить, причем не напримерах выдавамых на форумах, а по книгам и собственно самостоятельной работе. "Диспетчер задач" писать нужно уже тогда, когда ты понимаешь что пишешь. Иначе глюкозавр получится, или в лучшем случае понимание сути предмета будет поверхностным.
Джо (2005-08-26 03:49:00) [14]
> [4] 1236434 (26.08.05 03:47)
> Диспетчер задач пишу
А зачем? Ведь уже есть.
1236434 (2005-08-26 03:47:00) [15]Спасибо.
Мне посоветовали начать со сложного и с системы. стимул есть.
Диспетчер задач пишу
Джо (2005-08-26 03:29:00) [16]Вот что-то в таком роде. На форме кнопка и мемо. Не забыть uses TlHelp32.
procedure TForm6.Button1Click(Sender: TObject);
const
TAB = Chr(9);
var
Snapshot: THandle;
ProcInfo: PROCESSENTRY32;
begin
Memo1.Clear;
Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if Snapshot <> INVALID_HANDLE_VALUE then
begin
try
ProcInfo.dwSize := SizeOf(ProcInfo);
if Process32First (Snapshot,ProcInfo) then
repeat
Memo1.Lines.Add(
Format ('%d%s%s',[ProcInfo.th32ProcessID,TAB,ProcInfo.szExeFile])
);
until not Process32Next (Snapshot, ProcInfo);
finally
CloseHandle (Snapshot);
end;
end;
end;
Впрочем, я в системном программировании "плаваю". Пусть более знающие товарищи поправят, если что.
Кстати, если ты начинающий, то не занимайся этой ерундой.
1236434 (2005-08-26 03:09:00) [17]Извините, наверное мне надо в конференцию Новички, но не могли бы вы привести пример кода?
Джо (2005-08-26 03:02:00) [18]Если я правильно понял вопрос, то подойдет ли такая схема:
(под именем вы понимаете имя выполнямого модуля?)
1. CreateToolhelp32Snapshot
2. Process32First
3. в цикле выполняем Process32Next получая на каждой итерации заполненную структуру PROCESSENTRY32. В которой, помимо прочего есть ProcessID и имя ExeFile.