| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Список запущенных процессов |
| Автор: Люда 11.11.2002, 22:22 |
| Как программно узнать какие процессы запущены на локальном компьютере, или же запущен данный процесс или нет |
| Автор: 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 |
| Автор: Люда 12.11.2002, 19:22 |
| Это точно, а уменя как раз он родимый - NT |
| Автор: man2002ua 12.11.2002, 21:27 |
извиняй... на 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; Кривовато - но на скорую руку сойдет |
| Автор: AntonSaburov 13.11.2002, 02:36 |
| Надо конечно под NT 4.0 уже бросать что-то писать В том же MSDN EnumProcesses -> OpenProcess в цикле. |
| Автор: man2002ua 13.11.2002, 02:40 |
| "EnumProcesses -> OpenProcess в цикле" только при наличии необходимого SDK... допустим я его не имею. |
| Автор: AntonSaburov 13.11.2002, 03:32 |
| http://www.akzhan.midi.ru/devcorner/akdeltnt-content/akdeltnt-006D.html Вот там есть все Оказывается, и я там руку приложил |