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

niwlg2el  于 2022-11-23  发布在  其他
关注(0)|答案(3)|浏览(608)

下面的代码无法启动文档。我得到错误193(% 1不是有效的Win32应用程序)。启动可执行文件工作正常。文件正确关联,双击时它们会启动相应的应用程序。我已经搜索了SO和其他地方的错误消息,createprocess的东西等。(例如,Why is CreateProcess failing in Windows Server 2003 64-bit?我知道引用命令行。

  • 这是一个 Delphi XE2(更新4)Win32应用程序在Win7 64位VMWare虚拟机。
  • 该代码在主机(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;
xe55xuns

xe55xuns1#

该错误最可能的解释是:
1.您试图加载的文件不是可执行文件。CreateProcess要求您提供可执行文件。如果您希望能够用关联的应用程序打开任何文件,则需要ShellExecute而不是CreateProcess
1.加载可执行文件的某个依赖项(即链接到可执行文件的DLL)时出现问题。最常见的原因是32位可执行文件与64位DLL不匹配,反之亦然。若要进行调查,请使用Dependency Walker's配置文件模式来检查到底是什么问题。
从代码的底部往下阅读,我可以看到问题是第一个。

yhuiod9q

yhuiod9q2#

Button2ClickButton3Click函数传递klad.xlssmimime.txt。这些文件很可能不是真正的可执行文件。
要使用与任意文件关联的应用程序打开这些文件,请使用ShellExecute

ccrfmcuu

ccrfmcuu3#

如果你是Clion/anyOtherJetBrainsIDE用户,而***yourFile.exe***导致了这个问题,那么删除它,让应用从头开始创建并链接到库。这很有帮助。

相关问题