Форум: "WinAPI";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
Вниз
Программно отследить активность определенного процесса Найти похожие ветки
← →
Eugem © (2006-02-22 17:05) [0]Прошу помощи в решении задачи. Необходимо программно отследить активность определенного приложения (процесса). Её (активность) можно видеть, если нажать Alt+Ctrl+Del и появится диспетчер задач. Далее можно видеть число записей программы (счетчик записей), которые она делает во время выполнения. Очень важно программно определить именно число записей, которые делает процесс во время своего выполнения.
← →
clickmaker © (2006-02-22 17:17) [1]GetProcessTimes поможет в определении активности?
← →
begin...end © (2006-02-22 17:53) [2]> Eugem © (22.02.06 17:05)
> Далее можно видеть число записей программы (счетчик записей),
> которые она делает во время выполнения. Очень важно программно
> определить именно число записей, которые делает процесс
> во время своего выполнения.
GetProcessIOCounters
← →
Eugem © (2006-02-22 22:59) [3]GetProcessIOCounters подойдет, наверное. Вот только где описание этой функции?
← →
Eugem © (2006-02-23 00:40) [4]попробовал в программе GetProcessIOCounters, при обработке алгоритма в середине выскакивает ошибка ввода/вывода. Подскажите что не так. Вот код:
***
type
IO_COUNTERS = packed record
ReadOperationCount : LARGE_INTEGER;
WriteOperationCount : LARGE_INTEGER;
OtherOperationCount : LARGE_INTEGER;
ReadTransferCount : LARGE_INTEGER;
WriteTransferCount : LARGE_INTEGER;
OtherTransferCount : LARGE_INTEGER;
end;
function GetProcessIoCounters(HANDLE:THandle;PIO_COUNTERS:IO_COUNTERS):boolean; external "kernel32.dll" name "GetProcessIoCounters";
procedure TForm1.FormActivate(Sender: TObject);
var
hSnap:THandle;
pe:TProcessEntry32;
cz:boolean;
cou:IO_COUNTERS;
cous:LARGE_INTEGER;
begin
listbox1.Clear;
pe.dwSize:=SizeOf(pe);
hSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
cz:=GetProcessIoCounters(hSnap,cou);
If Process32First(hSnap,pe) then begin
listbox1.Items.Add(pe.szExeFile);
While Process32Next(hSnap,pe) do begin
listbox1.Items.Add(pe.szExeFile);
if GetProcessIoCounters(hSnap,cou) then cous:=cou.WriteOperationCount;
end;
end;
end;
***
← →
n0name (2006-02-23 06:33) [5]Неправльно перевел прототип финкции
BOOL GetProcessIoCounters(
HANDLE hProcess,
PIO_COUNTERS lpIoCounters
);
function GetProcessIoCounters(hPorcess: THandle; lpIoCounters: PIO_COUNTERS): boolean
PIO_COUNTERS = ^IO_COUNTERS;
← →
begin...end © (2006-02-23 09:37) [6]> Eugem © (22.02.06 22:59) [3]
В MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getprocessiocounters.asp
> Eugem © (23.02.06 00:40) [4]
Во-первых, см. [5]. Во-вторых, не указано нужное соглашение о вызове (stdcall). В-третьих, в функцию Вы почему-то передаёте не дескриптор процесса, а дескриптор снимка, возвращённый CreateToolhelp32Snapshot.type
TIOCounters = packed record
ReadOperationCount: Int64;
WriteOperationCount: Int64;
OtherOperationCount: Int64;
ReadTransferCount: Int64;
WriteTransferCount: Int64;
OtherTransferCount: Int64;
end;
function GetProcessIoCounters(hProcess: Cardinal; var lpIoCounters: TIOCounters): BOOL; stdcall; external "kernel32.dll";
var
hSnap, hProc: THandle;
Counters: TIOCounters;
PE: TProcessEntry32;
begin
hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if hSnap <> INVALID_HANDLE_VALUE then
try
PE.dwSize := sizeof(PE);
if Process32First(hSnap, PE) then
repeat
hProc := OpenProcess(PROCESS_QUERY_INFORMATION, False, PE.th32ProcessID);
try
if GetProcessIoCounters(hProc, Counters) then
ListBox.Items.Add(
Format("Id: %d ExeName: %s WriteCount: %d", [PE.th32ProcessID, PE.szExeFile, Counters.WriteOperationCount]))
finally
CloseHandle(hProc)
end
until not Process32Next(hSnap, PE)
finally
CloseHandle(hSnap)
end
end
← →
Eugem © (2006-02-23 13:37) [7]begin...end, огромное тебе СПАСИБО. Всё получилось :-) Я счастлив!!!!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.065 c