Форум: "WinAPI";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
ВнизID процеса по его имени Найти похожие ветки
← →
1236434 (2005-08-26 01:08) [0]Банальный вопрос.
как получить ID процесса зная только его имя.
Видимого окна нету, потому FindWindow не поможет.
← →
Джо © (2005-08-26 03:02) [1]Если я правильно понял вопрос, то подойдет ли такая схема:
(под именем вы понимаете имя выполнямого модуля?)
1. CreateToolhelp32Snapshot
2. Process32First
3. в цикле выполняем Process32Next получая на каждой итерации заполненную структуру PROCESSENTRY32. В которой, помимо прочего есть ProcessID и имя ExeFile.
← →
1236434 (2005-08-26 03:09) [2]Извините, наверное мне надо в конференцию Новички, но не могли бы вы привести пример кода?
← →
Джо © (2005-08-26 03:29) [3]Вот что-то в таком роде. На форме кнопка и мемо. Не забыть 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:47) [4]Спасибо.
Мне посоветовали начать со сложного и с системы. стимул есть.
Диспетчер задач пишу
← →
Джо © (2005-08-26 03:49) [5]
> [4] 1236434 (26.08.05 03:47)
> Диспетчер задач пишу
А зачем? Ведь уже есть.
← →
alpet © (2005-08-26 07:43) [6]1236434 (26.08.05 03:47) [4]
Советчики небось сами не поняли, чего посоветовали, и зачем. Чтобы начать, нужно сначала простое изучить, причем не напримерах выдавамых на форумах, а по книгам и собственно самостоятельной работе. "Диспетчер задач" писать нужно уже тогда, когда ты понимаешь что пишешь. Иначе глюкозавр получится, или в лучшем случае понимание сути предмета будет поверхностным.
← →
Игорь Шевченко © (2005-08-26 10:07) [7]
> как получить ID процесса зная только его имя.
А что такое "имя процесса" ?
← →
Leonid Troyanovsky © (2005-08-26 11:40) [8]
> Игорь Шевченко © (26.08.05 10:07) [7]
> А что такое "имя процесса" ?
Наверное, то, что возвращает NTQuerySystemInformation -
там есть такое, в структуре ProcessInfo (как ее повелось называть).
--
Regards, LVT.
← →
Игорь Шевченко © (2005-08-26 11:51) [9]Leonid Troyanovsky © (26.08.05 11:40) [8]
Тогда задача нерешаема, потому что процессов с одним именем может быть несколько.
← →
Leonid Troyanovsky © (2005-08-26 11:59) [10]
> Игорь Шевченко © (26.08.05 11:51) [9]
> Тогда задача нерешаема, потому что процессов с одним именем
> может быть несколько.
Почему не решаема?
Просто, может не иметь единственное решение.
--
Regards, LVT.
← →
Rouse_ © (2005-08-26 12:05) [11]> Диспетчер задач пишу
Изучай: http://rouse.front.ru/taskmon.zip
← →
Джо © (2005-08-26 14:45) [12]
> [6] alpet © (26.08.05 07:43)
> 1236434 (26.08.05 03:47) [4]
>
> Советчики небось сами не поняли, чего посоветовали, и зачем.
Советчики, или, если точнее, советчик, прекрасно понял то, что сам посоветовал. Если под "именем процесса" понимать имя исполнимого файла (а я это специально уточнил в [1] и автор вопроса согласился с таким толкованием), то код, приведенный в [3], как раз и иллюстрирует перечисление PID процессов и имен исполнимых файлов, соответствующих этим PID"ам.
Насчет, того, зачем я это посоветовал я тоже прекрасно осведомлен. Совет я свой давал до признания в [4].
---
Кстати, я оговорил, что свой код я не считаю единственно правильным подходом. И уж если остальные советчики считают нужным говорить о его неправильности, то было бы чудесно увидеть их работающий вариант.
← →
alpet © (2005-08-26 19:30) [13]Джо © (26.08.05 14:45) [12]
Сорри, если ты принял пост [6] на свой счет, который я отнес на самом деле к посту [4]. Не очень хороший совет, дал автору сабжа тот кто посоветовал "начать со сложного и с системы".
По сабжу же способ не вызывает нареканий (ибо классика).
← →
Джо © (2005-08-26 19:37) [14]
> [13] alpet © (26.08.05 19:30)
Теперь понял, спасибо, что объяснил :)
Прошу извинить резкий тон. Исключительно из-за недопонимания.
← →
alpet © (2005-08-26 19:48) [15]Примерное подобие для 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.
← →
psa247 © (2005-08-29 14:56) [16]
> Rouse_ ©
Александр, так будет лучше:
Result:= round(100 * Tmp / (Time - ProcessTimers[I].Time));
а здесь - черт его знает, алгоритм, вроде бы правильный...
while Result > 100 do Dec(Result, 100);
← →
Rouse_ © (2005-08-29 17:36) [17]> psa247 © (29.08.05 14:56) [16]
Согласен :)
← →
psa247 © (2005-08-31 09:53) [18]Так попробовал - тоже ерунда вылезает...
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;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.04 c