Dlaczego CreateProcess daje błąd 193 (% 1 nie jest prawidłową aplikacją Win32)

Poniższy kod nie uruchamia dokumentów. Dostaję błąd 193 (% 1 nie jest prawidłową aplikacją Win32). Uruchamianie plików wykonywalnych działa poprawnie. Pliki są odpowiednio powiązane, uruchamiają odpowiednią aplikację po dwukrotnym kliknięciu. Przeszukałem SO i gdzie indziej, aby uzyskać komunikat o błędzie, informacje o procesach twórczych itp.Dlaczego w systemie Windows Server 2003 nie działa 64-bitowa funkcja CreateProcess? Wiem o cytowaniu linii poleceń.

Jest to aplikacja Win32 Delphi XE2 (aktualizacja 4) w 64-bitowej maszynie wirtualnej VMWare Win7.

Kod również kończy się niepowodzeniem na hoście (Win7 64-bit) i wirtualnej maszynie wirtualnej z 32-bitowym XP.

Aplikacje, które powinny zostać uruchomione w Win7 VM (Excel 2003 i Crimson Editor) są 32-bitowe.

Błąd występuje zarówno podczas uruchamiania z IDE, jak i podczas uruchamiania samodzielnej aplikacji testowej

Kiedyś był to kod Delphi2007, skompilowana aplikacja D2007, z której pochodzi ten kod, działa wszędzie.

Co jest nie tak z kodem? To prawie tak, jakbym przeoczył coś bardzo oczywistego ....

Z góry dziękuję,

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;

questionAnswers(3)

yourAnswerToTheQuestion