下面的代码无法启动文档。我收到错误 193(%1 不是有效的 Win32 应用程序)。启动可执行文件工作正常。文件已正确关联,双击时它们会启动相应的应用程序。我已经在 SO 和其他地方搜索了错误消息、createprocess 内容等。(例如,为什么 CreateProcess 在 Windows Server 2003 64 位中失败? 我知道引用命令行。
这是 Win7 64 位 VMWare VM 中的 Delphi XE2(更新 4)Win32 应用程序。
该代码在主机(Win7 64 位)和具有 32 位 XP 的 Virtual PC VM 上也会失败。
应该在 Win7 VM(Excel 2003 和 Crimson Editor)中启动的应用程序是 32 位的。
从 IDE 启动或独立运行测试应用程序时都会发生故障
它曾经是 Delphi2007 代码,该代码来自的已编译 D2007 应用程序在任何地方都可以正常工作。
代码有什么问题?就好像我忽略了一些非常明显的东西......
提前致谢,
简
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;