做了一个监控程序来监测其他程序的运行状态,每隔一段时间用createtoolhelp32snapshot做进程快照然后遍历查找,每次遍历查找完后都用CloseHandle关闭快照,仍然出现虚拟内存耗尽的现象,用另外一个函数Closetoolhelp32snapshot函数却又没有定义,请教一下各位该怎么做。

解决方案 »

  1.   

    下面是关键代码: PROCESSENTRY32 processEntry = {0};
    MODULEENTRY32 me32 = {0}; HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if(hProcessSnap == INVALID_HANDLE_VALUE)return result;
    processEntry.dwSize = sizeof(PROCESSENTRY32);
    me32.dwSize = sizeof(MODULEENTRY32);
    BOOL bRet = Process32First(hProcessSnap, &processEntry); while(bRet)
    {
    HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,processEntry.th32ProcessID);
    if(p.processname.Compare(processEntry.szExeFile) == 0)
    {
    result = TRUE;
                    }
    bRet = Process32Next(hProcessSnap,&processEntry);
    CloseHandle(hModuleSnap);
    //CloseToolhelp32Snapshot(hModuleSnap);

    }
    CloseHandle(hProcessSnap);
      

  2.   

    我把HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,processEntry.th32ProcessID);和后面的CloseHandle(hModuleSnap);注释掉后就没有出现虚拟内存耗尽的现象了。
      

  3.   

    MSDN上有很完整的啊,帮你贴出来,MSDN上的,这个应该没的你说的问题#include <windows.h>
    #include <tlhelp32.h>
    #include <tchar.h>//  Forward declarations:
    BOOL GetProcessList( );//枚举进程
    BOOL ListProcessModules( DWORD dwPID );//枚举模块
    BOOL ListProcessThreads( DWORD dwOwnerPID );//线程
    void printError( TCHAR* msg );int main( void )
    {
      GetProcessList( );
      return 0;
    }BOOL GetProcessList( )
    {
      HANDLE hProcessSnap;
      HANDLE hProcess;
      PROCESSENTRY32 pe32;
      DWORD dwPriorityClass;  // Take a snapshot of all processes in the system.
      hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
      if( hProcessSnap == INVALID_HANDLE_VALUE )
      {
        printError( TEXT("CreateToolhelp32Snapshot (of processes)") );
        return( FALSE );
      }  // Set the size of the structure before using it.
      pe32.dwSize = sizeof( PROCESSENTRY32 );  // Retrieve information about the first process,
      // and exit if unsuccessful
      if( !Process32First( hProcessSnap, &pe32 ) )
      {
        printError( TEXT("Process32First") ); // show cause of failure
        CloseHandle( hProcessSnap );          // clean the snapshot object
        return( FALSE );
      }  // Now walk the snapshot of processes, and
      // display information about each process in turn
      do
      {
        _tprintf( TEXT("\n\n=====================================================" ));
        _tprintf( TEXT("\nPROCESS NAME:  %s"), pe32.szExeFile );
        _tprintf( TEXT("\n-------------------------------------------------------" ));    // Retrieve the priority class.
        dwPriorityClass = 0;
        hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
        if( hProcess == NULL )
          printError( TEXT("OpenProcess") );
        else
        {
          dwPriorityClass = GetPriorityClass( hProcess );
          if( !dwPriorityClass )
            printError( TEXT("GetPriorityClass") );
          CloseHandle( hProcess );
        }    _tprintf( TEXT("\n  Process ID        = 0x%08X"), pe32.th32ProcessID );
        _tprintf( TEXT("\n  Thread count      = %d"),   pe32.cntThreads );
        _tprintf( TEXT("\n  Parent process ID = 0x%08X"), pe32.th32ParentProcessID );
        _tprintf( TEXT("\n  Priority base     = %d"), pe32.pcPriClassBase );
        if( dwPriorityClass )
          _tprintf( TEXT("\n  Priority class    = %d"), dwPriorityClass );    // List the modules and threads associated with this process
        ListProcessModules( pe32.th32ProcessID );
        ListProcessThreads( pe32.th32ProcessID );  } while( Process32Next( hProcessSnap, &pe32 ) );  CloseHandle( hProcessSnap );
      return( TRUE );
    }
    BOOL ListProcessModules( DWORD dwPID )
    {
      HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
      MODULEENTRY32 me32;  // Take a snapshot of all modules in the specified process.
      hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );
      if( hModuleSnap == INVALID_HANDLE_VALUE )
      {
        printError( TEXT("CreateToolhelp32Snapshot (of modules)") );
        return( FALSE );
      }  // Set the size of the structure before using it.
      me32.dwSize = sizeof( MODULEENTRY32 );  // Retrieve information about the first module,
      // and exit if unsuccessful
      if( !Module32First( hModuleSnap, &me32 ) )
      {
        printError( TEXT("Module32First") );  // show cause of failure
        CloseHandle( hModuleSnap );           // clean the snapshot object
        return( FALSE );
      }  // Now walk the module list of the process,
      // and display information about each module
      do
      {
        _tprintf( TEXT("\n\n     MODULE NAME:     %s"),   me32.szModule );
        _tprintf( TEXT("\n     Executable     = %s"),     me32.szExePath );
        _tprintf( TEXT("\n     Process ID     = 0x%08X"),         me32.th32ProcessID );
        _tprintf( TEXT("\n     Ref count (g)  = 0x%04X"),     me32.GlblcntUsage );
        _tprintf( TEXT("\n     Ref count (p)  = 0x%04X"),     me32.ProccntUsage );
        _tprintf( TEXT("\n     Base address   = 0x%08X"), (DWORD) me32.modBaseAddr );
        _tprintf( TEXT("\n     Base size      = %d"),             me32.modBaseSize );  } while( Module32Next( hModuleSnap, &me32 ) );  CloseHandle( hModuleSnap );
      return( TRUE );
    }BOOL ListProcessThreads( DWORD dwOwnerPID ) 

      HANDLE hThreadSnap = INVALID_HANDLE_VALUE; 
      THREADENTRY32 te32; 
     
      // Take a snapshot of all running threads  
      hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); 
      if( hThreadSnap == INVALID_HANDLE_VALUE ) 
        return( FALSE ); 
     
      // Fill in the size of the structure before using it. 
      te32.dwSize = sizeof(THREADENTRY32); 
     
      // Retrieve information about the first thread,
      // and exit if unsuccessful
      if( !Thread32First( hThreadSnap, &te32 ) ) 
      {
        printError( TEXT("Thread32First") ); // show cause of failure
        CloseHandle( hThreadSnap );          // clean the snapshot object
        return( FALSE );
      }  // Now walk the thread list of the system,
      // and display information about each thread
      // associated with the specified process
      do 
      { 
        if( te32.th32OwnerProcessID == dwOwnerPID )
        {
          _tprintf( TEXT("\n\n     THREAD ID      = 0x%08X"), te32.th32ThreadID ); 
          _tprintf( TEXT("\n     Base priority  = %d"), te32.tpBasePri ); 
          _tprintf( TEXT("\n     Delta priority = %d"), te32.tpDeltaPri ); 
          _tprintf( TEXT("\n"));
        }
      } while( Thread32Next(hThreadSnap, &te32 ) );   CloseHandle( hThreadSnap );
      return( TRUE );
    }void printError( TCHAR* msg )
    {
      DWORD eNum;
      TCHAR sysMsg[256];
      TCHAR* p;  eNum = GetLastError( );
      FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
             NULL, eNum,
             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
             sysMsg, 256, NULL );  // Trim the end of the line and terminate it with a null
      p = sysMsg;
      while( ( *p > 31 ) || ( *p == 9 ) )
        ++p;
      do { *p-- = 0; } while( ( p >= sysMsg ) &&
                              ( ( *p == '.' ) || ( *p < 33 ) ) );  // Display the message
      _tprintf( TEXT("\n  WARNING: %s failed with error %d (%s)"), msg, eNum, sysMsg );
    }