运行.exe文件并获取返回值(使用WinExec和system的区别)

来源:互联网 发布:宾得k3 知乎 编辑:程序博客网 时间:2024/04/30 07:33

最近,跟同学在写一个界面,需要调用到已经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的用法的,可以参考下面的链接:

http://zhidao.baidu.com/link?url=sPhn7dpegsBMhMOtkGJSO0_d9OtjW4MfDq9BX_1XEfkqGICqU2YPRNTdUlQaiC-1Fztdh1n5DzazeCU9B2Br3_

test2编译生成test2.exe:


test5调用test2.exe,分如下两种情况:

(1)使用system()函数,如下图:


则0在最后一行显示:


(2)使用WinExec()函数,如下图:


则33(表示.exe调用正常的返回值)在最前面显示:





1 0
原创粉丝点击