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:
- 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 necesitaShellExecute
lugar deCreateProcess
. - 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()