2011-06-29 16 views
6

que acaba de intentar revocar un código de edad a partir de Windows XP que genera una lista de todos los procesos en ejecución, pero fracasó en Windows 7. Antes de continuar, aquí está el código:ERROR_BAD_LENGTH al llamar Process32First en Windows 7

#include <windows.h> 
#include <tlhelp32.h> 

int main() 
{ 
    HANDLE hSnap, hTemp; 
    PROCESSENTRY32 pe; 

    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

    if(Process32First(hSnap, &pe)) { 
     do { 
      ... 
      } 
     } while(Process32Next(hSnap, &pe)); 
    } 
    ... 
} 

Comprobé qué función falló y resultó que es Process32First. GetLastError() devolvió 24: "ERROR_BAD_LENGTH" No puedo entender cuál es el problema. ¿Alguna sugerencia?

Respuesta

8

De MSDN: http://msdn.microsoft.com/en-us/library/ms684834(VS.85).aspx

La aplicación de llamada debe establecer el miembro de dwSize PROCESSENTRY32 al tamaño, en bytes, de la estructura.

Para recuperar información sobre otros procesos grabados en la misma instantánea, use la función Process32Next.


EDIT: Usted probablemente querrá hacer algo como esto:

PROCESSENTRY32 pe = {0}; 
pe.dwSize = sizeof(PROCESSENTRY32); 
+0

gracias, que resuelva el problema! –

1

Hay un insecto en tlhelp32.h, cuando se invoca en WIN64:

Si hay una directiva #pragma paquete de alguna parte antes de incluir tlhelp32.h, generará una estructura PROCESSENTRY32 con el tamaño incorrecto. Entonces puede pasar cualquier cosa, incluso Process32First fallas, o incluso bloqueos.

intente incluir tlhelp32.h de esta manera:

#pragma pack(push,8) /* Work around a bug in tlhelp32.h in WIN64, which generates the wrong structure if packing has been changed */<br/> 
#include &lt;tlhelp32.h&gt;<br/> 
#pragma pack(pop) 
+2

Esto es esperado. [Los archivos de encabezado de Windows requieren un empaquetamiento de 8 bytes] (http://blogs.msdn.com/b/oldnewthing/archive/2009/04/22/9560726.aspx). –

+0

Esto no es un error en los encabezados de Windows, pero esta respuesta y el comentario de Raymond me ayudaron a encontrar un error en mi código. Un paquete '#pragma (push, 1)' sin un pop coincidente. – Steve