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;
Les explications les plus probables de cette erreur sont:
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
.En lisant au bas du code, je peux voir que le problème est le numéro 1.
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