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.
Questa è un’app Win32 Delphi XE2 (Update 4) in una VMWare VM a 64 bit Win7.
Il codice fallisce anche sul computer host (Win7 64 bit) e in un Virtual PC VM con XP a 32 bit.
Le app che dovrebbero essere avviate nella VM Win7 (Excel 2003 e Crimson Editor) sono a 32 bit.
L’errore si verifica sia quando si inizia dall’IDE o quando si esegue l’app di prova standalone
Era un codice Delphi2007, l’app compilata D2007 da cui proviene questo codice funziona bene ovunque.
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:
CreateProcess
richiede di fornire un file eseguibile. Se si desidera poter aprire qualsiasi file con l’applicazione associata, è necessario ShellExecute
anziché CreateProcess
. 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.