Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Список запущенных процессов


Автор: Люда 11.11.2002, 22:22
Как программно узнать какие процессы запущены на локальном компьютере, или  же запущен данный процесс или нет :omg

Автор: AntonSaburov 12.11.2002, 00:01
RTFM неплохо бы иногда. Прямо оттуда.

#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>

BOOL GetProcessList ()
{
   HANDLE         hProcessSnap = NULL;
   BOOL           bRet      = FALSE;
   PROCESSENTRY32 pe32      = {0};

   //  Take a snapshot of all processes in the system.

   hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

   if (hProcessSnap == INVALID_HANDLE_VALUE)
       return (FALSE);

   //  Fill in the size of the structure before using it.

   pe32.dwSize = sizeof(PROCESSENTRY32);

   //  Walk the snapshot of the processes, and for each process,
   //  display information.

   if (Process32First(hProcessSnap, &pe32))
   {
       DWORD         dwPriorityClass;
       BOOL          bGotModule = FALSE;
       MODULEENTRY32 me32       = {0};

       do
       {
           bGotModule = GetProcessModule(pe32.th32ProcessID,
               pe32.th32ModuleID, &me32, sizeof(MODULEENTRY32));

           if (bGotModule)
           {
               HANDLE hProcess;

               // Get the actual priority class.
               hProcess = OpenProcess (PROCESS_ALL_ACCESS,
                   FALSE, pe32.th32ProcessID);
               dwPriorityClass = GetPriorityClass (hProcess);
               CloseHandle (hProcess);

               // Print the process's information.
               printf( "\nPriority Class Base\t%d\n",
                   pe32.pcPriClassBase);
               printf( "PID\t\t\t%d\n", pe32.th32ProcessID);
               printf( "Thread Count\t\t%d\n", pe32.cntThreads);
               printf( "Module Name\t\t%s\n", me32.szModule);
               printf( "Full Path\t\t%s\n\n", me32.szExePath);
           }
       }
       while (Process32Next(hProcessSnap, &pe32));
       bRet = TRUE;
   }
   else
       bRet = FALSE;    // could not walk the list of processes

   // Do not forget to clean up the snapshot object.

   CloseHandle (hProcessSnap);
   return (bRet);
}

Автор: man2002ua 12.11.2002, 19:07
:D только под NT4 это не шибко сработает

Автор: Люда 12.11.2002, 19:22
Это точно, а уменя как раз он родимый - NT :(

Автор: man2002ua 12.11.2002, 21:27
:dg
извиняй...
на Delphi разберешся или переписать?

type UNICODE_STRING=record
   Length : word;
   MaximumLength : WORD;
   Buffer : PWideChar;
 end;

type TSom = record
       NextEntry : DWORD;
       ThreadCnt : DWORD;
       Reserv : array[1..6] of DWORD;
       CrTime : array[1..6] of DWORD;
       pName: UNICODE_STRING;
       prior : DWORD ;
       pid : DWORD;
       Inher : DWORD ;
       HandleCnt : DWORD ;
       Res:array[1..2] of DWORD;
       privCnt : DWORD ;
       Vm:array[1..11] of DWORD;
   end;

var
 NtQuerySystemInformation: function(v1:DWORD;v2:DWORD;v3:DWORD;v4:DWORD): integer stdcall;

procedure TForm1.FormCreate(Sender: TObject);
var Hmod, H, Hproc:THANDLE;
   pe: TPROCESSENTRY32;
   vi:TOSVersionInfoA;
   RetX:DWORD;
   ER: integer;
   my: ^TSom;
   S1,S2 : PChar;
   aaa1:array[1..131072] of DWORD;
begin
   H := LoadLibrary('ntdll.dll');
   @NtQuerySystemInformation := GetProcAddress(H,'NtQuerySystemInformation');
   asm
       lea eax,[aaa1];
       lea ebx,[RetX]
       push ebx;
       push 10000h;
       push eax;
       push 5;
       call NtQuerySystemInformation;
       mov [ER],eax;
   end;
   my := @aaa1[1];
   while true do
   begin
     if my^.NextEntry = 0 then break;
     if my^.pName.Buffer <> nil then
      begin
        StrCopy(S2,StrUpper(PChar(WideCharToString(my^.pName.Buffer))));
        KillPath(S2);
        if StrComp(S1,S2) = 0 then
        begin
          Hproc := OpenProcess(PROCESS_TERMINATE,FALSE,my^.pid);
          if Hproc <> 0 Then TerminateProcess(Hproc,0)
          else Error('Error process termination... ' + inttostr(GetLastError()));
            break;
          end;
      end;
      my := ptr(DWORD(my) + my^.NextEntry);
   end;
end;

Кривовато - но на скорую руку сойдет  :D

Автор: AntonSaburov 13.11.2002, 02:36
Надо конечно под NT 4.0 уже бросать что-то писать :)
В том же MSDN
EnumProcesses -> OpenProcess в цикле.

Автор: man2002ua 13.11.2002, 02:40
"EnumProcesses -> OpenProcess в цикле"
только при наличии необходимого SDK... допустим я его не имею. :thumbs-up

Автор: AntonSaburov 13.11.2002, 03:32
http://www.akzhan.midi.ru/devcorner/akdeltnt-content/akdeltnt-006D.html

Вот там есть все :)
Оказывается, и я там руку приложил :)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)