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


Автор: Gradov 24.3.2009, 17:31
В менеджерах процессов, таких как Process Explorer, Task Info есть возможность увидеть кол-во открытых HANDLES для процесса. Как это можно сделать програмно?

Автор: azesmcar 24.3.2009, 17:41
http://msdn.microsoft.com/en-us/library/ms682489(VS.85).aspx

Process32Next возвращяет структуру..там есть все что надо

Автор: Gradov 24.3.2009, 17:57
Код

PROCESSENTRY32 ppe;

typedef struct tagPROCESSENTRY32 {
  DWORD     dwSize;
  DWORD     cntUsage;
  DWORD     th32ProcessID;
  ULONG_PTR th32DefaultHeapID;
  DWORD     th32ModuleID;
  DWORD     cntThreads;
  DWORD     th32ParentProcessID;
  LONG      pcPriClassBase;
  DWORD     dwFlags;
  TCHAR     szExeFile[MAX_PATH];
} PROCESSENTRY32, *PPROCESSENTRY32;

Process32Next(CreateToolhelp32Snapshot(0,GetCurrentThreadID()),&ppe);


Где здесь кол-во HANDLES? Не нашел.

Автор: azesmcar 24.3.2009, 18:03
Gradov неправильно помнил значит..

http://msdn.microsoft.com/en-us/library/ms683214(VS.85).aspx
Цитата

GetProcessHandleCount Function

Retrieves the number of open handles that belong to the specified process.


это пойдет?

Автор: Gradov 24.3.2009, 18:32
Отлично, то что надо.  smile  Спасибо.

azesmcar, а попутно не в курсе из-за чего может расти кол-во HANDLES в приложении. Если я точно все их закрываю с помощью CloseHandle, 10 раз проверял  если HANDLE открывается, то обязательно есть CloseHandle. Но в процессе работы программы кол-во HANDLES равномерно растет, с чего бы это?

Автор: jonie 24.3.2009, 22:55
растет всегда? быть может винда чего там у себя кеширует?..
провел тест:
Код

    DWORD count;
    BOOL rv;
    rv = GetProcessHandleCount(GetCurrentProcess(), &count);
    if(!rv) {
        std::cerr<<GetLastError();
        throw "FAILED";
    }
    std::cout<<"count:"<<count<<"\n";

    HANDLE hfile = CreateFile(L"C:\\ntldr",0, FILE_SHARE_READ, 0, OPEN_EXISTING,0,0);

    GetProcessHandleCount(GetCurrentProcess(), &count);
    std::cout<<"count:"<<count<<"\n";

    CloseHandle(hfile);

    GetProcessHandleCount(GetCurrentProcess(), &count);
    std::cout<<"count:"<<count<<"\n";


было 8 стало 9 потом 8. Заметьте, что количество изначально не нуль.... можно копануть IDAой)

Автор: Gradov 25.3.2009, 12:42
Цитата(jonie @  24.3.2009,  22:55 Найти цитируемый пост)
было 8 стало 9 потом 8. Заметьте, что количество изначально не нуль.


Да я тоже себе сделал такой тест и у меня также идет работа - несколько прибавит, потом несколько убавит. Но иногда кол-во убавленных получается меньше в результате растет число открытых HANDLES. Первое, что можно предположить - где-то не закрывается Handle, но я очень тщательно все проверил. Мне в общем надо это только лишь по одной причине - проверить чтобы программа точно нормально работала и не было исключения типа "system out if resources".

Автор: azesmcar 25.3.2009, 12:46
Цитата

Да я тоже себе сделал такой тест и у меня также идет работа - несколько прибавит, потом несколько убавит. Но иногда кол-во убавленных получается меньше в результате растет число открытых HANDLES. Первое, что можно предположить - где-то не закрывается Handle, но я очень тщательно все проверил. Мне в общем надо это только лишь по одной причине - проверить чтобы программа точно нормально работала и не было исключения типа "system out if resources".


не забывай что твой процесс делает не только то что ты ему приказал, он подгружает библиотеки для АПИ которые ты используешь (это тоже хендл)..так что вполне возможно, а в чем собственно проблема?

Автор: Gradov 25.3.2009, 15:59
Цитата(azesmcar @  25.3.2009,  12:46 Найти цитируемый пост)
не забывай что твой процесс делает не только то что ты ему приказал, он подгружает библиотеки для АПИ которые ты используешь (это тоже хендл)..так что вполне возможно

Ну если так пускай равномерно увеличиваются. 

Цитата(azesmcar @  25.3.2009,  12:46 Найти цитируемый пост)
а в чем собственно проблема

Да проблемы собственно нет пока, работаю на предупреждение. Еще раз говорю - чтобы нормально программа работала, без ошибок. А то если начнут handles прибавляться в неуёмном кол-ве - долбанет исключение и в общем программа может и зависнуть и полететь.

Автор: Unudiop 2.12.2022, 00:10
Модератор: Сообщение скрыто.

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