El código siguiente 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 otras partes del mensaje de error, etc. cosas CreateProcess (Ej Why is CreateProcess failing in Windows Server 2003 64-bit? que sé de citar la línea de comandos.¿Por qué CreateProcess proporciona el error 193 (% 1 no es una aplicación Win32 válida)
Ésta es una XE2 Delphi (Update 4) Win32 aplicación de 64 bits en un Win7 VMWare VM.
el código también falla en la máquina host (Win7 64 bits) y en un PC virtual VM con 32 bits de XP.
las aplicaciones que deben comenzar en el Win7 VM (Excel 2003 y carmesí Editor) son 32 bits.
Se produce el fallo tanto cuando se parte de la IDE o cuando se ejecuta la aplicación de pruebas autónomo
lo que solía ser Delphi2007 código, la aplicación D2007 compilado en el código proviene de las obras excelentes en todas partes.
¿Qué pasa con el código? Es casi como si estuviera pasando por alto algo muy obvio ....
Gracias de antemano,
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;
¿Qué ocurre para decir el último si se llama específicamente bloc de notas en el archivo de texto? – BugFinder
No estoy familiarizado con Delphi, pero WINAPI 'CreateProcess()' se puede utilizar para iniciar '.exe's solamente. Si desea ejecutar otros tipos de archivos, debe usar ['ShellExecute()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153 (v = vs.85) .aspx) – hmjd
@hjmd Ese código solía funcionar en la versión de código anterior, llamando a archivos .XLS. –