关于MFC中使用ShellExecute出现的进程冲突问题

目录

问题背景

问题分析


问题背景

       现在有一个MFC写的界面程序,以及一个外部exe文件。用户通过界面选择文件a,MFC将文件a的路径作为参数,调用exe文件生成一个解析文件b,然后MFC再读取这个文件b。

       为了完成这一目的,就需要在MFC中调用外部exe文件,我这里选用的是ShellExecute函数。

//function
...
HINSTANCE proc = ShellExecute(this->m_hWnd, L"open", L"pdf2txt.exe", FilePath, L".\\", SW_HIDE);  //异步调用
//伪代码
  if(!open(b))
  {
     Warn("Open failed !") and return;
  }
  read(b);
...

       看似逻辑正确,但是实际运行时会出现这样的情况:在第一次执行function时会出现文件b打开失败的情况,但是接着执行第二次function又变成正常的了,这是什么原因呢?

问题分析

       按道理来说,第一次执行时先调用外部exe文件就会生成文件b,那么接着再打开文件b应该是可以打开的,而这里打开文件b失败,由于文件b是由无到有,因此最有可能的就是在打开b文件的时候b文件不存在导致的。

       为什么b文件会不存在呢?一种可能的原因是ShellExecute函数调用失败,但是通过测试发现,第一次function执行结束后,b文件是存在的,也就是说,ShellExecute是的执行是成功的;那么,为什么b文件明明能够生成,但是open时不存在呢?最大的可能就是b文件是在open之后生成的,也就是说,函数实际运行的顺序并没有按照逻辑来

       换句话说,ShellExecute开辟一个进程去执行exe文件,当前进程继续按照当前程序执行,两个进程的执行顺序是不定的,这就有可能出现当前进程比运行exe的进程更快地就执行到open函数了,此时open函数时发现b文件不存在,然后较慢的进程才执行exe文件生成了b文件。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值