Простой интерес по поводу закрытия дескрипторов.
От: maxidroms Россия  
Дата: 09.03.05 14:01
Оценка:
Ниже приведен довольно простой код вывода на экран списка процессов и имена их exe-файлов.

Где то читал ресурс майкрософта на котором он ОЧЕНЬ СОВЕТОВАЛ закрывать любой открытый дескриптор.

В нашем случае мы делаем OpenProcess в начале цикла.И мы же закрываем открытый при этом дескриптор в конце цикла при удачном завершении.

но посмотрите на строчки
}
else return;

Если мы сумели сделать OpenProcess но ошибка произошла в if ( EnumProcessModules..... то у нас выполянется return.
и значит дело до CloseHandle не доходит.

Этот кусок когда из МСДН.

Мне просто стало интересно правилен ли этот код?Да безусловно он работает но ведь дескрипторы не всегда могут быть закрыты.

    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return;

    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);
    
    for ( i = 0; i < cProcesses; i++ )
    {
        char szProcessName[MAX_PATH] = "unknown";

        // Get a handle to the process.

        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                    PROCESS_VM_READ,
                                    FALSE, processID );

        // Get the process name.

        if (NULL != hProcess )
        {
            HMODULE hMod;
            DWORD cbNeeded;

            if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
                &cbNeeded) )
            {
                GetModuleBaseName( hProcess, hMod, szProcessName, 
                                sizeof(szProcessName) );
            }
            else return;
        }
        else return;

        // Print the process name and identifier.

        printf( "%s (Process ID: %u)\n", szProcessName, processID );

        CloseHandle( hProcess );

    }


09.03.05 18:30: Перенесено модератором из 'C/C++' — Павел Кузнецов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.