上面代码是toolhelp api
不是psapi

解决方案 »

  1.   

    不好意思,弄错了,不过Win2000支持 Toolhelp和PSAPI的,Win98只支持toolhelp,Winnt只支持PSAPI
    既然2000支持toolhelp,为什么结果不正确?
      

  2.   

    我做好了,下面为全部代码, Console Application。#include <windows.h>
    #include <stdio.h>
    //#include "psapi.h"HINSTANCE g_hPsapi;typedef BOOL (WINAPI *_EnumProcesses)
    (
     DWORD *lpidProcess,  // array of process identifiers
     DWORD cb,            // size of array
     DWORD *cbNeeded      // number of bytes returned
    );typedef BOOL (WINAPI *_EnumProcessModules)
    (
      HANDLE hProcess,      // handle to process
      HMODULE *lphModule,   // array of module handles
      DWORD cb,             // size of array
      LPDWORD lpcbNeeded    // number of bytes required
    );typedef DWORD (WINAPI *_GetModuleBaseName)(
      HANDLE hProcess,    // handle to process
      HMODULE hModule,    // handle to module
      LPTSTR lpBaseName,  // base name buffer
      DWORD nSize         // maximum characters to retrieve
    );typedef DWORD (WINAPI *_GetModuleFileNameEx)(
      HANDLE hProcess,    // handle to process
      HMODULE hModule,    // handle to module
      LPTSTR lpFilename,  // path buffer
      DWORD nSize         // maximum characters to retrieve
    );_EnumProcesses pEnumProcesses;
    _EnumProcessModules pEnumProcessModules;
    _GetModuleBaseName pGetModuleBaseName;
    _GetModuleFileNameEx pGetModuleFileNameEx;BOOL init()
    { g_hPsapi = LoadLibrary( "psapi.dll" );
    if( g_hPsapi )
    {

    pEnumProcesses = (_EnumProcesses)GetProcAddress( g_hPsapi, "EnumProcesses" );
    pEnumProcessModules = (_EnumProcessModules)GetProcAddress( g_hPsapi, "EnumProcessModules" );
    pGetModuleBaseName = (_GetModuleBaseName)GetProcAddress( g_hPsapi, "GetModuleBaseNameA" );
    pGetModuleFileNameEx = (_GetModuleFileNameEx)GetProcAddress( g_hPsapi, "GetModuleFileNameExA" );

    if( !pEnumProcesses || !pEnumProcessModules || !pGetModuleBaseName || !pGetModuleFileNameEx)
    return FALSE;
    return TRUE;
    } return FALSE;
    }void destory()
    {
    if( g_hPsapi )
    FreeLibrary( g_hPsapi );
    }void PrintProcessNameAndID( DWORD processID )
    {
        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 ( hProcess )
        {
            HMODULE hMod;
            DWORD cbNeeded;        if ( pEnumProcessModules( hProcess, &hMod, sizeof(hMod), 
                 &cbNeeded) )
            {
                pGetModuleFileNameEx( hProcess, hMod, szProcessName, 
                                   sizeof(szProcessName) );
            }
        }    // Print the process name and identifier.    printf( "%s (Process ID: %u)\n", szProcessName, processID );    CloseHandle( hProcess );
    }void main( )
    {
        // Get the list of process identifiers.    DWORD aProcesses[1024], cbNeeded, cProcesses;
        unsigned int i; if( !init() )
    {
    printf("Load Failed\r\n");
    return;
    }
        if ( !pEnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
            return;    // 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++ )
            PrintProcessNameAndID( aProcesses[i] ); destory();
    }