32

下面的代码无法启动文档。我收到错误 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;
4

3 回答 3

36

该错误最可能的解释是:

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

阅读到代码的底部,我可以看到问题是第 1 个问题。

于 2012-09-28T09:34:40.767 回答
7

您的Button2ClickandButton3Click函数通过klad.xlsand smimime.txt。这些文件很可能确实不是实际的可执行文件。

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

于 2012-09-28T09:39:46.363 回答
-2

如果您是 Clion/anyOtherJetBrainsIDE 用户,并且yourFile.exe导致此问题,只需将其删除并让应用程序从头开始创建并将其与库链接。它有助于。

于 2018-05-26T14:07:00.927 回答