2011-08-09 23 views
6

que estoy tratando de compilar el código heredado de Windows XP en un nuevo contexto en Windows 7. Se compila pero no en tiempo de ejecución.CreateProcess falla en Windows 7

CreateProcess() devuelve 0 y GetLastError() devuelve 2, lo que significa ERROR_FILE_NOT_FOUND

Aquí está mi llamada a CreateProcess

STARTUPINFO StartInfo; 
memset(&StartInfo, 0, sizeof(StartInfo)); 

wcsncpy(astrCommandLine, L"TFTP", MAX_OSCOMMANDLINE_SZ-1); 
BOOL bFuncRetn = CreateProcess(NULL, 
       astrCommandLine,  // command line 
       NULL,   // process security attributes 
       NULL,   // primary thread security attributes 
       NULL,   // handles are inherited 
       0,    // creation flags 
       NULL,   // use parent's environment 
       NULL,   // use parent's current directory 
       &StartInfo,   // STARTUPINFO pointer 
       &m_ProcInfo); // receives PROCESS_INFORMATION 

ya por las rarezas: Cuando en lugar de TFTP corro calc, calc aparece. Puedo ejecutar lo que esté en mi línea de comando desde cualquier lugar en un símbolo del sistema, así que me dice que el% PATH% to c: \ windows \ system32 es conocido y funciona correctamente.

traté de forzar CreateProcessA con cadenas ANSI pero me dio el mismo resultado. También probé en la configuración de depuración y liberación y desde la línea de comandos.

¿Alguna idea?

EDIT: Tanto calc.exe como tftp.exe se encuentran en c: \ windows \ system32 que se encuentra en la ruta del sistema.
ejecutando "c: \ windows \ system32 \ tftp" no funciona

+0

Está TFTP ser encontrado por una ruta de la aplicación en lugar de la ruta del sistema? Eso podría explicar por qué se encuentra calc pero tftp no lo es. CreateProcess no utiliza las rutas de la aplicación. Supongo que está configurando StartInfo.cb en algún lugar. –

+0

Hay muy pocas esperanzas de que esto funcione. Seguramente tftp.exe no se encuentra en el directorio de trabajo predeterminado de su programa. Calc.exe no es un problema, está en la RUTA. Pase la ruta * completa * de .exe, como c: \ foo \ bar \ tfpt.exe. –

+0

Nunca oí hablar de StartInfo.cb – Eric

Respuesta

9

El problema es que tiene una aplicación de 32 bits que intenta ejecutar un comando de Windows de 64 bits. No tiene que volver a compilar su aplicación como 64 bits para resolver el problema. Todo lo que tiene que hacer es cambiar todas las apariciones de c: \ windows \ system32 a c: \ windows \ SysNative.

En Windows 7 x64, las referencias a c: \ windows \ system32 de los programas de 32 bits son redirigidos automáticamente a C: \ Windows \ SysWOW64. El uso del alias especial c: \ windows \ SysNative hace que Windows 7 no haga la redirección.