¿Por qué CreateProcess da el error 193 (% 1 no es una aplicación Win32 válida)?

El siguiente código no puede iniciar documentos. Obtengo el error 193 (% 1 no es una aplicación Win32 válida). Iniciar ejecutables funciona bien. Los archivos están asociados correctamente, inician la aplicación correspondiente al hacer doble clic. He buscado SO y en otro lugar para el mensaje de error, crear cosas de proceso, etc. ( Por ejemplo, ¿ Por qué falla CreateProcess en Windows Server 2003 de 64 bits? Sé citar la línea de comando.

  • Esta es una aplicación Win32 Delphi XE2 (Actualización 4) en una máquina virtual WinWard VMware de 64 bits.

  • El código también falla en la máquina host (Win7 64 bit) y en una VM de Virtual PC con 32bit XP.

  • Las aplicaciones que deberían comenzar en Win7 VM (Excel 2003 y Crimson Editor) son de 32 bits.

  • El error ocurre tanto al iniciarse desde el IDE como al ejecutar la aplicación de prueba de forma independiente

  • Solía ​​ser el código Delphi2007, la aplicación comstackda D2007 de donde viene este código funciona bien en todos lados.

¿Qué pasa con el código? Es casi como si estuviera pasando por alto algo muy obvio …

Gracias por adelantado,

Ene

procedure StartProcess(WorkDir, Filename: string; Arguments : string = ''); var StartupInfo : TStartupInfo; ProcessInfo : TProcessInformation; lCmd : string; lOK : Boolean; LastErrorCode: Integer; begin FillChar( StartupInfo, SizeOf( TStartupInfo ), 0 ); StartupInfo.cb := SizeOf( TStartupInfo ); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := sw_Normal; FillChar( ProcessInfo, SizeOf( TProcessInformation ), 0 ); lCmd := '"' + WorkDir + FileName + '"'; // Quotes are needed https://stackoverflow.com/questions/265650/paths-and-createprocess if Arguments  '' then lCmd := lCmd + ' ' + Arguments; lOk := CreateProcess(nil, PChar(lCmd), nil, nil, FALSE, // TRUE makes no difference 0, // eg CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS makes no difference nil, nil, // PChar(WorkDir) makes no difference StartupInfo, ProcessInfo); if lOk then begin try WaitForSingleObject(ProcessInfo.hProcess, INFINITE); finally CloseHandle( ProcessInfo.hThread ); CloseHandle( ProcessInfo.hProcess ); end; end else begin LastErrorCode := GetLastError; ShowMessage(IntToStr(LastErrorCode) + ': ' + SysErrorMessage(LastErrorCode)); end; end; procedure TFrmStartProcess.Button1Click(Sender: TObject); begin StartProcess('c:\program files (x86)\axe3\','axe.exe'); // Works end; procedure TFrmStartProcess.Button2Click(Sender: TObject); begin StartProcess('d:\','klad.xls'); // Fails end; procedure TFrmStartProcess.Button3Click(Sender: TObject); begin StartProcess('d:\','smimime.txt'); // Fails end; 

Las explicaciones más probables para ese error son:

  1. El archivo que está intentando cargar no es un archivo ejecutable. CreateProcess requiere que proporciones un archivo ejecutable. Si desea poder abrir cualquier archivo con su aplicación asociada, entonces necesita ShellExecute lugar de CreateProcess .
  2. Hay un problema al cargar una de las dependencias del ejecutable, es decir, las DLL que están vinculadas al ejecutable. La razón más común es una discrepancia entre un archivo ejecutable de 32 bits y un archivo DLL de 64 bits, o viceversa. Para investigar, use el modo de perfil de Dependency Walker para verificar exactamente qué está pasando mal.

Al leer la parte inferior del código, puedo ver que el problema es el número 1.

Sus funciones klad.xls y smimime.txt pasan klad.xls y smimime.txt . Es muy probable que estos archivos no sean realmente ejecutables.

Para abrir archivos arbitrarios usando la aplicación asociada a ellos, use ShellExecute

Si usted es usuario de Clion / anyOtherJetBrainsIDE y su archivo FileFile.exe causa este problema, simplemente bórrelo y deje que la aplicación lo cree y lo vincule con libs desde cero. Ayuda.