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

时间:2012-09-28 09:23:41

标签: windows delphi winapi delphi-xe2 delphi-2007

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

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

  • 代码也在主机(Win7 64位)和32位XP的虚拟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 个答案:

答案 0 :(得分:24)

该错误最可能的解释是:

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

答案 1 :(得分:6)

您的Button2ClickButton3Click个函数通过了klad.xlssmimime.txt。这些文件很可能确实不是实际的可执行文件。

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

答案 2 :(得分:0)

让我在此处添加示例:

我正在尝试在Windows平台上构建Alluxio并遇到相同的问题,这是因为pom.xml包含以下步骤:

      <plugin>
        <artifactId>exec-maven-plugin</artifactId>
        <groupId>org.codehaus.mojo</groupId>
        <inherited>false</inherited>
        <executions>
          <execution>
            <id>Check that there are no Windows line endings</id>
            <phase>compile</phase>
            <goals>
              <goal>exec</goal>
            </goals>
            <configuration>
              <executable>${build.path}/style/check_no_windows_line_endings.sh</executable>
            </configuration>
          </execution>
        </executions>
      </plugin>

.sh文件在Windows上不可执行,因此会引发错误。

如果要在Windows上构建Alluxio,请注释掉它。

答案 3 :(得分:-2)

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