ZeroMemory на локальную переменную PROCESSENTRY32? - PullRequest
2 голосов
/ 05 октября 2010

Мне нужно было перечислить запущенные процессы и некоторое время удивлялся, почему мой код не работает:

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))
    ....

Проблема заключалась в том, что Process32First всегда возвращал FALSE из-за ошибки ERROR_BAD_LENGTH.

После удаления строки ZeroMemory все стало работать нормально.Итак, вопрос в том, почему ZeroMemory вызвал это?Он должен просто заполнить память по адресу X для Z байтов.Я часто использую его для структур, похожих на указатели winapi, на этот раз я не понял, что это локальная переменная, но это не объясняет проблему или нет?

Спасибо,

Кра

РЕДАКТИРОВАТЬ: плюс я обнаружил, что код отлично работает только в версии отладки, как только я скомпилировал его как версию выпуска, он снова прослушивается: /

Ответы [ 2 ]

1 голос
/ 05 октября 2010

Вы должны установить dwSize, а не dwFlags.

ProcEntry.dwFlags = sizeof(PROCESSENTRY32);

должно быть

ProcEntry.dwSize = sizeof(PROCESSENTRY32);
0 голосов
/ 05 октября 2010

Вы не можете обнулить всю структуру PROCESSENTRY32, поскольку она самоописывает себя - вы должны установить dwSize.Из образца здесь :

  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 );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...