浅析C++中的system/WinExec/ShellExecute/CreateProcess

来源:互联网 发布:淘宝买家信息采集 编辑:程序博客网 时间:2024/05/19 19:31

【system】

编程时,我们常常需要让程序从后台调用其它程序来达到某些目的。比如点击我们程序的某个按钮,这个按钮就触发了某个exe程序的启动操作。通常我们使用的都是system函数。如下:

system("\"d:\\program files\\testing.exe\" hello");

这个语句相当于在命令行中敲入:"d:\\programfiles\\testing.exe" hello",其中,因为program files文件夹的命名中包含空格,所以在exe所在的完整路径两端需要有引号将之括起来。hello是传递给testing.exe程序的参数(hello不需要被包含在exe所在的双引号内)。

这是个很方便的用法,但需要注意的是,如果在这个语句底下,有其它需要执行的语句A\B\C,那么在system语句调用起testing.exe这个进程后,一般如果这个exe不结束,那么A\B\C语句将不会被执行。

比如如果testing.exe是个窗口程序,那么我们需要先关闭这个窗口(或者简单粗暴地kill掉这个进程),system语句底下的A\B\C才会开始执行。

这样当然存在其好处,比如对于某些exe安装程序,我们使用system调用它们,那么安装完成后,它们的进程通常会自觉地结束,这个时候再往下执行其它语句,正是我们所希望的。而如果我们不希望调用了某程序X后,我们的程序傻愣在那里等着我们结束X,而是直接继续往下走,我们就不应该使用system。


 

【WinExec】

我们可以使用WinExec函数,如下:

WinExec("testing.exe", SW_NORMAL);

这个函数会直接调用起exe程序,然后不管其死活,我们的代码会去执行下一行。

system和WinExec的优点在于使用简单。而且,都支持一般的命令行而不只是支持打开exe。如果我需要运行sikuli的脚本项目,通过命令行输入

"java -Dpython.path=C:\\sikuliEnv\\ -jar C:\\sikuliEnv\\sikuli-script.jar C:\\sikuliEnv\\sikuliProject" 回车,就可以达到目的,运行sikuliProject项目。

而如果是在C++程序中,我们需要的就是将这个命令string放到system或者WinExec中。而对于ShellExecute和CreateProcess,似乎行不通。

 

【ShellExecute】

ShellExecute同样可以在所打开进程未结束前继续执行往下的语句。其函数原型如下:

HINSTANCE ShellExecute(HWND hwnd,           //运行的窗口句拼 LPCTSTR lpOperation, //运行方式       LPCTSTR lpFile,   //文件及路径       LPCTSTR lpParameters,//参数(一般程序没有)       LPCTSTR lpDirectory, //默认搜索路径       INT nShowCmd         //当程序运行后的显示方式)

这里给出一个使用该ShellExecute函数的例子:

HINSTANCE hInstance;hInstance = ShellExecute(NULL, L"open", L"testing.exe", L"-Arg_Scan", NULL, SW_SHOW);CloseHandle(hInstance);

其中,"-Arg_Scan"是testing.exe需要的参数,SW_SHOW表示显示地调用目标程序,除了它,还有其它形式比如SW_MINIZED表示调用目标程序,但让该程序最小化在任务栏里(如果你需要调用一个第三方窗口程序默默运行,不想它的界面弹出来,就可以使用SW_MINIZED。更多的选择可以在vs中将鼠标移动到该参数上然后右键跳转去选择查看)。

再提供一个使用浏览器打开网页的例子:

//#define IE L"iexplore.exe"   //#define URL L"http://www.baidu.com/"  HINSTANCE hInstance;  hInstance = ShellExecute(NULL, L"open", URL, NULL, NULL, SW_HIDE); CloseHandle(hInstance);

ShellExecute的参数列表显然要比WinExec复杂,但其功能更强大。网友表示:

“应当尽量使用ShellExecute函数,它支持指定工作路径、兼容性更强。此外,WinExec是直到程序调用GetMessage()或者超时才会返回,而ShellExecute和CreateProcess则是直接返回的。”

本人尚未深入实践探索过2者间的区别。

 

【CreateProcess】

CreateProcess区别于上面3者的最大特点在于它创建了新的进程。先来看看其函数原型:

BOOL CreateProcess(LPCTSTR lpApplicationName,//可执行模块LPTSTR lpCommandLine,//要执行的命令行LPSECURITY_ATTRIBUTES lpProcessAttributes,//是否返回的句柄可以被子进程继承LPSECURITY_ATTRIBUTES lpThreadAttributes,//线程是否被继承BOOL bInheritHandles,//指示新进程是否从调用进程处继承了句柄DWORD dwCreationFlags,//...LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,//指定子进程的工作路径LPSTARTUPINFO lpStartupInfo,LPPROCESS_INFORMATIONlpProcessInformation);

调用例子:

STARTUPINFO si = { sizeof(si) };   PROCESS_INFORMATION pi; BOOL bRet=CreateProcess (NULL,(LPSTR)cmdLine.c_str(),NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);    int error = GetLastError(); //如果创建子进程失败会返回错误码 if(bRet)//创建子进程成功   {  DWORD result=WaitForSingleObject( pi.hProcess, 3000);//INFINITE表示除非该子进程结束,否则永远不往下执行。if(result==WAIT_TIMEOUT)//超时{CloseHandle (pi.hThread);   CloseHandle (pi.hProcess);cout<<"Time out."<<endl; return false;}else{cout<<cmdPara<<"[Analysis::createProcess] Success!"<<endl;CloseHandle (pi.hThread);   CloseHandle (pi.hProcess); return true;}}   else//创建子进程失败,报告错误码{CloseHandle (pi.hThread);   CloseHandle (pi.hProcess); cout<<Fail to call. Error Code: "<<error<<endl;return false;}

WaitForSingleObjec的返回值除了上面的WAIT_TIMEOUT,还可能返回:

WAIT_ABANDONED

WAIT_OBJECT_0,表示核心对象已被激活

WAIT_FAILED,出错,可通过GetLastError得到错误码

一般可视WAIT_OBJECT_0为正常返回值。不过如果调用的是某进程abc.exe,当认为强制关闭abc.exe时,同样会返回WAIT_OBJECT_0。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一岁两个月宝宝不爱吃饭怎么办 罗汉鱼头座大颜色不红怎么办 为什么孩子的牙都是龋齿怎么办呀 蓝迪儿童墙膜出现气泡了怎么办 空sd卡或文件系统不受支持怎么办 8个月宝宝吃了纸怎么办 宝宝出生两天了不吃不喝怎么办 八个月宝宝阴唇边红肿痛怎么办 儿童五周岁九个月比同龄矮怎么办 8个月宝宝长牙母乳喂养咬人怎么办 6周的孩子视力低常怎么办 宝宝吃了甜食生痰咳嗽怎么办 两个月的边牧抵抗力差怎么办 阴茎勃起后向上翘的厉害怎么办 5个月宝宝发烧38.5度怎么办 9个月宝宝发烧38.5度怎么办 八个月宝宝只吃母乳不吃奶粉怎么办 八个月母乳不够宝宝不吃奶粉怎么办 八个月宝宝吃母乳不吃奶粉怎么办 八个月宝宝戒奶不吃奶粉怎么办 刚满月的宝宝发烧38度怎么办 未满月的宝宝发烧38度怎么办 半月大的婴儿吃奶就漾奶怎么办 上司交给你不能完成的任务怎么办 电脑光驱里放入光碟放不出来怎么办 黑暗之魂3太难了怎么办 苹果手机下载的游戏闪退怎么办 宝宝两岁了不怎么爱拉大便怎么办? 小狗脖子发硬疼的直叫怎么办 厨房里有很多小虫子围着鸡蛋怎么办 狗生小狗后几天不吃饭怎么办 还没满月的小兔子突然死了怎么办 宝宝小鸡被蚊子咬后肿得很大怎么办 不知道是哪知兔子下的小兔怎么办 兔子生完小兔不吃东西了怎么办 人工喂养七天的小羊拉希怎么办 仔兔出生3天吃过奶就尿怎么办 小兔子买回来两天不拉屎怎么办 大狗生了小狗把小狗咬死了怎么办 狗妈妈一直咬小狗的脐带怎么办 狗狗体内驱虫驱不干净怎么办