Poniższy kod nie uruchamia dokumentów. Pojawia się błąd 193 (% 1 nie jest prawidłową aplikacją Win32). Uruchamianie plików wykonywalnych działa dobrze. Pliki są poprawnie powiązane, po dwukrotnym kliknięciu rozpoczynają odpowiednią aplikację. Przeszukałem SO i gdzie indziej na komunikat o błędzie, CreateProccess rzeczy itp (np Why is CreateProcess failing in Windows Server 2003 64-bit? wiem o cytowanie wiersza poleceń.Dlaczego CreateProcess daje błąd 193 (% 1 nie jest prawidłową aplikacją Win32)
To Delphi XE2 (Update 4) aplikacja Win32 w Win7 64bit VMWare VM.
Kod zawiedzie także na maszynie hosta (Win7 64 bit) oraz w Virtual PC VM z 32bit XP.
aplikacje, które powinny rozpocząć się w Win7 VM (Excel 2003 i Crimson Editor) są 32-bitowe:
Niepowodzenie występuje zarówno przy uruchamianiu z IDE lub gdy działa aplikacja testy samodzielnych
Kiedyś kod Delphi2007, skompilowaną aplikację D2007 gdzie ten kod pochodzi z działa dobrze wszędzie.
Co jest nie tak z kodem? To prawie tak, jakbym widokiem na coś bardzo oczywistego ....
góry dzięki,
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;
Co dzieje się powiedzieć ostatni jeśli specjalnie zadzwonić notes w pliku tekstowym? – BugFinder
Nie jestem zaznajomiony z Delphi, ale WINAPI 'CreateProcess()' może być użyty tylko do uruchomienia '.exe's. Jeśli chcesz _run_ inne typy plików, musisz użyć ['ShellExecute()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153 (v = vs.85) .aspx). – hmjd
@hjmd Ten kod działał w poprzedniej wersji kodu, wywołując pliki .XLS. –