Aracılığıyla paylaş


Tüm İşlemleri Numaralandırma

Aşağıdaki örnek kod, sistemdeki her işlem nesnesinin işlem tanımlayıcısını almak için EnumProcesses işlevini kullanır. EnumProcessModules her bir işlem adını almak ve yazdırmak için çağrılır.

Not veya Dikkat

64 bit işlemler için EnumProcessModulesEx işlevini kullanın.

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>

// To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS
// and compile with -DPSAPI_VERSION=1

void PrintProcessNameAndID( DWORD processID )
{
    TCHAR szProcessName[MAX_PATH] = TEXT("<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)/sizeof(TCHAR) );
        }
    }

    // Print the process name and identifier.

    _tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );

    // Release the handle to the process.

    CloseHandle( hProcess );
}

int main( void )
{
    // Get the list of process identifiers.

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

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


    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the name and process identifier for each process.

    for ( i = 0; i < cProcesses; i++ )
    {
        if( aProcesses[i] != 0 )
        {
            PrintProcessNameAndID( aProcesses[i] );
        }
    }

    return 0;
}

Ana işlev, EnumProcesses işlevini kullanarak işlemlerin listesini alır. Her işlem için main, PrintProcessNameAndID işlevini çağırarak işlem tanımlayıcısını geçirir. PrintProcessNameAndID, işlem tutamacını almak için OpenProcess işlevini çağırır. OpenProcess başarısız olursa, çıktı işlem adını <bilinmeyen>olarak gösterir. Örneğin, OpenProcess, erişim kısıtlamaları kullanıcı düzeyi kodun bunları açmasını engellediğinden Boşta ve CSRSS işlemleri için başarısız olur. Ardından, PrintProcessNameAndID modül tanıtıcılarını almak için EnumProcessModules işlevini çağırır. Son olarak, PrintProcessNameAndID yürütülebilir dosyanın adını almak için GetModuleBaseName işlevini çağırır ve işlem tanımlayıcısıyla birlikte adı görüntüler.