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

前端之家收集整理的这篇文章主要介绍了Windows – 为什么CreateProcess给出错误193(%1不是有效的Win32应用程序)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以下代码无法启动文档.我得到错误193(%1不是有效的Win32应用程序).启动可执行文件工作正常.
文件正确关联,双击时启动相应的应用程序.
搜索了SO和其他地方的错误消息,创建处理内容等(例如 Why is CreateProcess failing in Windows Server 2003 64-bit?
我知道引用命令行.

>这是Win7 64位VMWare虚拟机中的一个Delphi XE2(Update 4)Win32应用程序.
>代码在主机(Win7 64位)和虚拟PC虚拟机(32位XP)中也失败.
>应该在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,FALSE,// TRUE makes no difference
                       0,// e.g. CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS makes no difference
                       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;
错误的最有可能的解释是:

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

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

猜你在找的Windows相关文章