以下代码无法启动文档。我收到错误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;
答案 0 :(得分:24)
该错误最可能的解释是:
CreateProcess
要求您提供可执行文件。如果您希望能够使用其关联的应用程序打开任何文件,则需要ShellExecute
而不是CreateProcess
。读到代码的底部,我可以看到问题是数字1。
答案 1 :(得分:6)
您的Button2Click
和Button3Click
个函数通过了klad.xls
和smimime.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链接。它会有所帮助。