web-dev-qa-db-fra.com

Pourquoi CreateProcess donne-t-il l'erreur 193 (% 1 n'est pas une application Win32 valide)

Le code ci-dessous ne parvient pas à démarrer les documents. J'obtiens l'erreur 193 (% 1 n'est pas une application Win32 valide). Le démarrage des exécutables fonctionne correctement. Les fichiers sont correctement associés, ils démarrent l'application correspondante lors d'un double clic. J'ai recherché SO et ailleurs pour le message d'erreur, des trucs createprocess, etc. (Par exemple Pourquoi CreateProcess échoue dans Windows Server 2003 64 bits? Je sais comment citer le ligne de commande.

  • Il s'agit d'une application Win32 Delphi XE2 (mise à jour 4) dans une machine virtuelle VMWare Win7 64 bits.

  • Le code échoue également sur la machine hôte (Win7 64 bits) et sur un PC virtuel VM avec XP 32 bits.

  • Les applications qui devraient démarrer dans Win7 VM (Excel 2003 et Crimson Editor) sont 32 bits.

  • L'échec se produit à la fois lors du démarrage de IDE ou lors de l'exécution de l'application de test autonome

  • Il s'agissait du code Delphi2007, l'application D2007 compilée d'où provient ce code qui fonctionne très bien partout.

Quel est le problème avec le code? C'est presque comme si j'écartais quelque chose de très évident ...

Merci d'avance,

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;
18
Jan Doggen

Les explications les plus probables de cette erreur sont:

  1. Le fichier que vous essayez de charger n'est pas un fichier exécutable. CreateProcess vous oblige à fournir un fichier exécutable. Si vous souhaitez pouvoir ouvrir n'importe quel fichier avec son application associée, vous avez besoin de ShellExecute plutôt que CreateProcess.
  2. Un problème est survenu lors du chargement de l'une des dépendances de l'exécutable, c'est-à-dire les DLL liées à l'exécutable. La raison la plus courante en est une incompatibilité entre un exécutable 32 bits et une DLL 64 bits, ou vice versa. Pour enquêter, utilisez le mode de profil Dependency Walker pour vérifier exactement ce qui ne va pas.

En lisant au bas du code, je peux voir que le problème est le numéro 1.

24
David Heffernan

Votre Button2Click et Button3Click les fonctions passent klad.xls et smimime.txt. Ces fichiers ne sont probablement pas de véritables exécutables.

Afin d'ouvrir des fichiers arbitraires à l'aide de l'application qui leur est associée, utilisez ShellExecute

6
Frerich Raabe