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.

O que é? errado com o código? É quase como se estivesse a esquecer algo muito óbvio....

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;
Author: Community, 2012-09-28

3 answers

As explicações mais prováveis para esse erro são:

  1. 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 de ShellExecute em vez de CreateProcess.
  2. 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.
Ao ler para o fundo do Código, vejo que o problema é o número 1.
 24
Author: David Heffernan, 2012-09-28 09:59:15

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

 6
Author: Frerich Raabe, 2012-09-28 09:39:46

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.

 -2
Author: Bogdan Dvorianov, 2018-05-26 14:07:00