为什么CreateProcess给出错误193(%1不是有效的Win32应用程序)

下面的代码无法启动文档。 我得到错误193(%1不是有效的Win32应用程序)。 启动可执行文件正常工作。 这些文件正确关联,双击时会启动相应的应用程序。 我search了SO和其他地方的错误消息,createprocess的东西等(例如为什么CreateProcess在Windows Server 2003 64位失败?我知道引用命令行。

  • 这是Win7 64位VMWare VM中的Delphi XE2(Update 4)Win32应用程序。

  • 在主机(Win7 64位)和32位XP虚拟PC虚拟机上,代码也失败。

  • 应该在Win7 VM(Excel 2003和Crimson Editor)中启动的应用程序是32位的。

  • 从IDE启动或独立运行testing应用程序时都会发生故障

  • 它曾经是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, // 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; 

这个错误的最可能的解释是:

  1. 您尝试加载的文件不是可执行文件。 CreateProcess要求您提供一个可执行文件。 如果你希望能够打开任何文件及其关联的应用程序,那么你需要ShellExecute而不是CreateProcess
  2. 加载可执行文件的一个依赖关系,即链接到可执行文件的DLL,有一个问题。 最常见的原因是32位可执行文件和64位DLL之间不匹配,反之亦然。 要进行调查,请使用Dependency Walker的配置文件模式来检查到底发生了什么问题。

读到代码的底部,我可以看到问题是数字1。

你的Button2ClickButton3Click函数传递klad.xlssmimime.txt 这些文件很可能不是真正的可执行文件。

为了使用与它们关联的应用程序打开任意文件,使用ShellExecute