首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从EXE执行EXE

从EXE执行EXE
EN

Stack Overflow用户
提问于 2013-08-23 14:16:43
回答 1查看 395关注 0票数 1

我有3个程序,App1.exe、App2.exe和App3.exe。每个程序都可以独立运行,但是App2.exe可以使用ShellExecuteEx运行App3.exe,App1.exe可以使用ShellExecuteEx运行App2.exe (这反过来可以运行App3)。App3具有可选的命令行参数,如果使用,GUI将不会显示,但会自动生成输出文件并关闭。当App2运行传递命令行参数的App3时,它工作得很好,但是当App1运行运行传递命令行参数的App3的App2时,App3的ShellExecuteEx返回true,但是GUI会显示,并且不会创建输出文件。

你知道为什么会发生这种事吗?它确实在Windows上工作,但在Vista或7上不起作用。我也尝试使用CreateProcess(),它提供了相同的结果。所有3个应用程序都在同一个文件夹中。

代码语言:javascript
复制
FillChar( exInfo, Sizeof(exInfo), 0 );
with exInfo do
begin
  cbSize:= Sizeof( exInfo );
  fMask := SEE_MASK_NOCLOSEPROCESS;
  lpVerb:= 'open';
  lpFile:= PChar('App3.exe');
  lpParameters := PChar('/Param1 Param2 "' + folderpath + 'outputfile.txt"');
  nShow := SW_HIDE;
end;
if ShellExecuteEx( @exInfo ) then
begin
  repeat
    Sleep( 500 );
    GetExitCodeProcess( exinfo.hProcess, exitcode )
  until (exitcode <> STILL_ACTIVE);
end;
CloseHandle( exinfo.hProcess );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-23 21:02:03

当App2运行App3时,不管App2是直接运行还是由App1运行,App3都以完全相同的方式运行。因此,运行App1的App2不可能影响App2运行App3的方式。

可以影响的是App2的初始工作目录,也就是App3的初始工作目录。因此,您应该始终使用绝对路径,不仅对参数值,而且对.exe路径也是如此。您还应该考虑使用SHELLEXECUTEINFO.lpDirectory字段来指定初始工作目录。这样你的应用程序就不可能在做工作时找错目录了。

尽管如此,如果您仍然有相同的问题,那么我建议您让App3输出它接收到的实际命令行参数(MessageBox()、OutputDebugString()、一个文件等等)。它可能收到了与您预期不同的信息,也可能是对参数的错误解析。

最后,在附带说明中,您可以将Sleep()+GetExitCodeProcess()循环替换为对WaitForSingleObject()的单个调用(如果需要在等待时运行消息循环,则使用MsgWaitForMultipleObjects() ),然后在需要时调用GetExitCodeProcess()一次以获得最终结果:

代码语言:javascript
复制
if ShellExecuteEx( @exInfo ) then
begin
  if WaitForSingleObject(exinfo.hProcess, INFINITE) = WAIT_OBJECT_0 then
    GetExitCodeProcess( exinfo.hProcess, exitcode );
  CloseHandle( exinfo.hProcess );
end;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18405071

复制
相关文章

相似问题

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