首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么CreateProcess显示错误193 (%1不是有效的Win32应用)

为什么CreateProcess显示错误193 (%1不是有效的Win32应用)
EN

Stack Overflow用户
提问于 2012-09-28 17:23:41
回答 3查看 119.6K关注 0票数 30

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

  • 这是一个在Win7 64位VMWare虚拟机中的Delphi XE2 (更新4) Win32应用程序。
  • 代码在主机(Win7 64位)和带有32位XP的虚拟PC VM上也会失败。
  • 应在Win7 VM (Excel2003和Crimson编辑器)中启动的应用程序为32位。
  • 从集成开发环境启动或运行测试应用程序独立版本时都会出现故障
  • 它曾经是Delphi2007代码,此代码所来自的已编译D2007应用程序在任何地方都可以正常运行。

< code >F212

代码有什么问题?就好像我忽略了一些非常明显的东西……

提前谢谢你,

1月

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;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-28 17:34:41

对该错误最可能的解释是:

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

往下读到代码的底部,我可以看到问题是第一个。

票数 35
EN

Stack Overflow用户

发布于 2012-09-28 17:39:46

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

要使用与文件相关联的应用程序打开任意文件,请使用ShellExecute

票数 7
EN

Stack Overflow用户

发布于 2018-05-26 22:07:01

如果你是Clion/anyOtherJetBrainsIDE用户,yourFile.exe导致了这个问题,只要删除它,让应用程序从头开始创建并链接到libs即可。这很有帮助。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12637203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档