Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
9-1119467426
Germany
2005-06-22 23:10
2005.11.06
Отрожение в воде


1-1129084104
Timon2
2005-10-12 06:28
2005.11.06
ComboBox и специальные символы


9-1117662227
Темас
2005-06-02 01:43
2005.11.06
Реалистичная траектория падения снежинки Как сделать ?


6-1121698752
rOOse
2005-07-18 18:59
2005.11.06
Скачивание файла


10-1106911438
Sancho
2005-01-28 14:23
2005.11.06
Как дебагить сервер приложений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский