浅析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。
- 浅析C++中的system/WinExec/ShellExecute/CreateProcess
- system、WinExec、ShellExecute、CreateProcess
- system,WinExec, ShellExecute,CreateProcess 区别
- WinExec, ShellExecute,CreateProcess
- WinExec, ShellExecute, CreateProcess
- WinExec, ShellExecute, CreateProcess -- (修正)
- WinExec,ShellExecute ,CreateProcess
- ShellExecute, WinExec, CreateProcess
- WinExec,ShellExecute ,CreateProcess 区别
- ShellExecute, WinExec, CreateProcess区别
- createprocess ,shellexecute , winexec
- WinExec,ShellExecute ,CreateProcess
- WinExec, ShellExecute,CreateProcess 区别
- (收藏)WinExec, ShellExecute, CreateProcess
- WinExec、ShellExecute和CreateProcess
- WinExec, ShellExecute, CreateProcess
- WinExec, ShellExecute, CreateProcess
- ShellExecute, WinExec, CreateProcess区别
- 如果你真的需要理由,一万个够不够,
- 【POJ】3177 Redundant Paths 边连通
- Red and Black
- 【甘道夫】HBase基本数据操作详解【完整版,绝对精品】
- disable/enable validate/novalidate 的区别
- 浅析C++中的system/WinExec/ShellExecute/CreateProcess
- n!faculty在其官网宣布解散旗下CS:GO分队
- Tomcat 7.0的配置
- NSProxy中methodSignatureForSelector、forwardInvocation两个消息方法
- 去看我房间空气我就放开了去我就放开了去
- mongodb java简单使用
- 苹果推送小记
- 混合语言编程之VC++和C#管道通信
- 关于MacBook电脑vim的配置和设置以及关于vim编辑器的一些快捷键的使用