win32 win válida visual valida una studio solucionar solucion setup problema para instalar impresora error dev avast aplicación aplicacion windows delphi winapi delphi-xe2 delphi-2007

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



solucionar problema aplicacion win32 no valida (3)

Las explicaciones más probables para ese error son:

  1. El archivo que está intentando cargar no es un archivo ejecutable. CreateProcess requiere que proporcione 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 de esto es una falta de coincidencia entre un ejecutable de 32 bits y una DLL de 64 bits, o viceversa. Para investigar, use el modo de perfil de Dependency Walker para verificar exactamente qué está mal.

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

El siguiente código no puede iniciar documentos. Recibo el error 193 (% 1 no es una aplicación Win32 válida). Los ejecutables de arranque funcionan bien. Los archivos están correctamente asociados, inician la aplicación correspondiente cuando se hace doble clic. He buscado SO y en otras partes el mensaje de error, las cosas de createprocess, etc. ( Por ejemplo, ¿por qué está fallando CreateProcess en Windows Server 2003 de 64 bits? Sé que debo citar la línea de comandos.

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

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

  • Las aplicaciones que deben iniciarse en Win7 VM (Excel 2003 y Crimson Editor) son de 32 bits.

  • El error se produce tanto al iniciar desde el IDE como al ejecutar la aplicación de prueba independiente

  • Solía ​​ser el código Delphi2007, la aplicación compilada D2007 donde este código proviene de funciona bien en todas partes.

¿Qué hay de malo 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, // e.g. 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;


Si usted es usuario de Clion / anyOtherJetBrainsIDE y su File.exe causa este problema, simplemente elimínelo y deje que la aplicación cree y vincule con libs desde un principio. Ayuda.


Sus funciones klad.xls y smimime.txt pasan klad.xls y smimime.txt . Estos archivos probablemente no son ejecutables reales de hecho.

Para abrir archivos arbitrarios usando la aplicación asociada con ellos, use ShellExecute()