В приведенном ниже коде не удается запустить документы. Я получаю ошибку 193 (% 1 не является допустимым приложением Win32). Запуск исполняемых файлов отлично работает. Файлы правильно связаны, они запускают соответствующее приложение при двойном щелчке. Я искал SO и в других местах для сообщения об ошибке, создания материала процесса и т.д. (Например, Почему сбой в CreateProcess в 64-разрядной версии Windows Server 2003? Я знаю о цитировании командной строки.
-
Это приложение Win32 для Delphi XE2 (обновление 4) в виртуальной VMWare Win7 64-бит.
-
Код также терпит неудачу на главном компьютере (бит Win7 64 бит) и в виртуальной виртуальной машине ПК с 32-разрядным XP.
-
Приложения, которые должны запускаться в Win7 VM (Excel 2003 и Crimson Editor), являются 32-разрядными.
-
Сбой происходит как при запуске с IDE, так и при автономном выполнении тестового приложения
-
Раньше это был код Delphi2007, скомпилированное приложение D2007, в котором этот код исходит из работы отлично.
Что не так с кодом? Это почти так, как будто я пропускаю что-то очень очевидное....
Спасибо заранее,
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/info/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;