在PROCESSENTRY32局部变量上的ZeroMemory?

时间:2010-10-05 14:36:57

标签: visual-c++ winapi

我需要枚举正在运行的进程,并且想知道为什么我的代码无效:

PROCESSENTRY32 ProcEntry;
ZeroMemory (&ProcEntry, sizeof (PROCESSENTRY32)); //problem
ProcEntry.dwFlags = sizeof(PROCESSENTRY32);

HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

if (Snapshot == INVALID_HANDLE_VALUE)
    return false;

if (Process32First(Snapshot, &ProcEntry))
    ....

问题是由于ERROR_BAD_LENGTH错误,Process32First总是返回FALSE。

一旦我删除了ZeroMemory系列,一切都开始正常了。所以问题是,为什么ZeroMemory会引起它呢?它应该只填充X的地址为Z字节的内存。我对winapi指针式结构使用了很多,这次我没有意识到它是一个局部变量,但这并没有解释问题或者它是什么?

谢谢,

克拉

编辑:加上我发现代码在Debug版本中工作正常,一旦我将其编译为Release版本,它再次出现错误:/

2 个答案:

答案 0 :(得分:1)

您应该设置dwSize,而不是dwFlags

ProcEntry.dwFlags = sizeof(PROCESSENTRY32);

应该是

ProcEntry.dwSize = sizeof(PROCESSENTRY32);

答案 1 :(得分:0)

您不能将整个PROCESSENTRY32结构归零,因为它是自我描述的 - 您必须设置dwSize。来自样本here

  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 );
  }