目录
问题背景
现在有一个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文件。