Porque é que o CreateProcess dá o erro 193 (%1 não é uma aplicação Win32 válida)
o código abaixo não dá início aos documentos. Obtive o erro 193 (o % 1 não é uma aplicação Win32 válida). Iniciar executáveis funciona bem. Os arquivos estão devidamente associados, eles iniciam o aplicativo correspondente quando clicado duplo. Eu procurei assim e em outro lugar para a mensagem de erro, createprocess coisas etc. (Por exemplo porque é que o CreateProcess está a falhar no Windows Server 2003 64-bit? Eu sei sobre citar a linha de comando.
Este é um aplicativo Delphi XE2 (Update 4) Win32 em um Win7 64bit VMWare VM.
o código também falha na máquina host (Win7 64 bit) e em um PC Virtual VM com 32bit XP.
os aplicativos que devem começar no Win7 VM (Excel 2003 e editor Crimson) são 32 bits.
a falha ocorre tanto ao começar a partir do IDE ou ao executar o teste app standalone
costumava ser o código Delphi2007, o app D2007 compilado de onde este código vem funciona bem em todos os lugares.
obrigado antecipadamente,
Jan
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;
3 answers
As explicações mais prováveis para esse erro são:
- o ficheiro que está a tentar carregar não é um ficheiro executável.
CreateProcess
necessita que forneça um ficheiro executável. Se você deseja ser capaz de abrir qualquer arquivo com a sua aplicação associada, então você precisa deShellExecute
em vez deCreateProcess
. - Existe um problema ao carregar uma das dependências do executável, ou seja, os DLLs que estão ligados ao executável. A razão mais comum para isso é um desfasamento entre um 32 bits executável e um DLL de 64 bits, ou vice-versa. Para investigar, use o modo de perfil de Dependency Walker para verificar exactamente o que está a correr mal.
As suas funções Button2Click
e Button3Click
passam klad.xls
e smimime.txt
. Estes arquivos provavelmente não são executáveis de fato.
Para abrir ficheiros arbitrários utilizando a aplicação associada a eles, use ShellExecute
Se for um utilizador de cylion/qualquer outro utilizador de jeetbrainside, e o teu ficheiro.exe cause este problema, apenas exclua - o e deixe o aplicativo criá-lo e ligá-lo com libs a partir de um arranhão. Ajuda.