Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.05 c
11-1110074904
серый мЫш
2005-03-06 05:08
2005.11.06
TKOLMainMenu


14-1128965939
опрос
2005-10-10 21:38
2005.11.06
какая средняя зарплата у программистов в Киеве?


4-1125491487
Black Krok
2005-08-31 16:31
2005.11.06
Исчерпание ресурсов Windows


3-1127796192
Сергей_1983
2005-09-27 08:43
2005.11.06
Группировка в dxDBGrid


14-1129705139
WondeRu
2005-10-19 10:58
2005.11.06
Идиотские баги известных программ...