Perché CreateProcess restituisce l’errore 193 (% 1 non è un’app Win32 valida)

Il codice seguente non riesce ad avviare i documenti. Ottengo l’errore 193 (% 1 non è un’applicazione valida per Win32). Gli eseguibili di partenza funzionano bene. I file sono associati correttamente, avviano l’app corrispondente quando si fa doppio clic. Ho cercato SO e altrove per il messaggio di errore, creare processi ecc. (Ad esempio, perché CreateProcess ha esito negativo in Windows Server 2003 a 64 bit? So di citare la riga di comando.

Cosa c’è che non va nel codice? È quasi come se stessi trascurando qualcosa di molto ovvio …

Grazie in anticipo,

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, // eg 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; 

Le spiegazioni più probabili per quell’errore sono:

  1. Il file che stai tentando di caricare non è un file eseguibile. CreateProcess richiede di fornire un file eseguibile. Se si desidera poter aprire qualsiasi file con l’applicazione associata, è necessario ShellExecute anziché CreateProcess .
  2. C’è un problema nel caricare una delle dipendenze dell’eseguibile, cioè le DLL che sono collegate all’eseguibile. Il motivo più comune è la mancata corrispondenza tra un eseguibile a 32 bit e una DLL a 64 bit o viceversa. Per investigare, usa la modalità profilo di Dependency Walker per verificare esattamente cosa sta andando storto.

Leggendo fino in fondo al codice, posso vedere che il problema è il numero 1.

Button3Click funzioni klad.xls e smimime.txt passano klad.xls e smimime.txt . Questi file molto probabilmente non sono effettivamente eseguibili.

Per aprire file arbitrari utilizzando l’applicazione ad essi associata, utilizzare ShellExecute

Se sei un utente di Clion / anyOtherJetBrainsIDE e yourFile.exe causa questo problema, cancellalo e lascia che l’app lo crei e lo colleghi con libs da zero. Aiuta.