最近,跟同学在写一个界面,需要调用到已经release出来的.exe文件,这其中就需要传输命令行参数并获取返回值,虽然不是很复杂的一件事,但还是把找到的一些资料记录下来,也许会给遇到相同疑问的朋友带来一点方便。
一开始,我使用的是WinExec函数,百度一下调用.exe文件的函数,便会有一大堆关于WinExec、ShellExecute、CreateProcess这三个函数的介绍,它们的复杂程度从低到高依次增加,可见WinExec是最简单的一个了,因为我只需要简单的调用,所以暂时使用WinExec。
关于以上三个函数的使用,可以参考下面的链接:http://blog.csdn.net/manji_lee/article/details/8079110
本以为万事大吉了,但是,我的程序需要获取运行.exe之后的返回值(.exe源码中main函数return的值),然后用一个if条件语句,根据返回的值进行不同的操作。我发现,虽然成功运行了.exe,但是返回给我的值一直是33。
string path = "F:\\My_Work\\Code\\C++\\test2\\Debug\\test2.exe";
int a = WinExec(path.data(), SW_SHOWMAXIMIZED);
也就是说,我成功运行上面的代码,但是a一直为33,后来才发现,WinExec只能返回是否运行成功,返回值大于31,则表示运行成功。所以,实际上,我并不能真正得到我想要的返回值——main函数的return值。
关于WinExec函数的返回值说明,可以参考下面的链接:http://www.cnblogs.com/ziwuge/archive/2012/03/12/2392472.html
所以我找到了system()函数,将代码修改为如下的形式:
string path = "F:\\My_Work\\Code\\C++\\test2\\Debug\\test2.exe";
//int a = WinExec(path.data(), SW_SHOWMAXIMIZED);
int b = system(path.data());
此时,便能够正确地得到.exe源码中main函数return的值了。
关于system和WinExec的区别,可以参考下面的链接:http://shashanzhao.com/archives/642.html
该链接中,第4点说法如下:
system是同步调用进程,调用的进程不结束,就不返回。而WinExec是不同步的进程调用,一调用就立刻返回一个值(该值代表是否运行成功),不会等调用的程序结束。举个例子:
若还不理解main函数的命令行参数argc和argv的用法的,可以参考下面的链接:
test2编译生成test2.exe:
test5调用test2.exe,分如下两种情况:
(1)使用system()函数,如下图:
则0在最后一行显示:
(2)使用WinExec()函数,如下图:
则33(表示.exe调用正常的返回值)在最前面显示: