system WinExec ShellExecuteEx
2013-04-11 18:16
399 查看
windows编程的时候经常需要调用操作系统提供的命令,比如调用net user命令可以在系统中新建一个用户等。
1. 最简单的调用方法就是使用函数system(),例如
system("copy d:\\1.rar d:\\2.rar");
属于C Runtime Library,调用该函数会阻塞调用线程。
优点:简单方便,既可以调用任意目录下的可执行程序,也可以调用类似copy这样的内部命令。
缺点:如果编写的是窗体程序,调用时会出现一个黑框,影响美观,不支持unicode。
2. 如果不想出现黑框,则使用WinExec()函数,例如:
WinExec("cmd /c copy d:\\111.rar d:\\222.rar",SW_HIDE);
属于Win32API,函数运行后立即返回,不阻塞调用线程。
优点:也很简单,可以调用任意目录下的可执行程序,调用时候不会出现黑框。
缺点:不支持unicode,不支持内部命令调用(解决方法:内部命令前加cmd/c)。
补充:该函数应该是被MS废弃了,应该用CreateProcess代替,但CreateProcess函数虽然无比强大但调用参数也无比复杂,还不如第三种方式来得简单。
3. 最为强大的是ShellExecuteEx()方式:
写一个函数:
BOOL RunExec(const TCHAR *cmd, const TCHAR*para, DWORD dwMilliseconds)
{
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize =sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask =SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb =NULL;
ShExecInfo.lpFile =cmd;
ShExecInfo.lpParameters =para;
ShExecInfo.lpDirectory =NULL;
ShExecInfo.nShow =SW_HIDE;
ShExecInfo.hInstApp =NULL;
BOOL suc =ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess, dwMilliseconds);
return suc;
}
const TCHAR* cmd接收调用的命令,const TCHAR*para接收命令后的参数,DWORD dwMilliseconds接收毫秒数,如果传入0,则该函数调用命令后立即返回,如果传入INFINITE,则函数会阻塞调用线程,直到命令完成,传入其它值例如1000,则阻塞调用线程最多1秒,调用方法例如:
RunExec(_T("cmd"), _T("/c copy d:\\111.rard:\\222.rar"), INFINITE);
属于Win32 API,调用线程阻塞与否可以控制。
优点:支持unicode,调用线程阻塞与否可以调节,调用不会出黑框。
缺点:不支持内部命令(前面加cmd /c解决)。
1. 最简单的调用方法就是使用函数system(),例如
system("copy d:\\1.rar d:\\2.rar");
属于C Runtime Library,调用该函数会阻塞调用线程。
优点:简单方便,既可以调用任意目录下的可执行程序,也可以调用类似copy这样的内部命令。
缺点:如果编写的是窗体程序,调用时会出现一个黑框,影响美观,不支持unicode。
2. 如果不想出现黑框,则使用WinExec()函数,例如:
WinExec("cmd /c copy d:\\111.rar d:\\222.rar",SW_HIDE);
属于Win32API,函数运行后立即返回,不阻塞调用线程。
优点:也很简单,可以调用任意目录下的可执行程序,调用时候不会出现黑框。
缺点:不支持unicode,不支持内部命令调用(解决方法:内部命令前加cmd/c)。
补充:该函数应该是被MS废弃了,应该用CreateProcess代替,但CreateProcess函数虽然无比强大但调用参数也无比复杂,还不如第三种方式来得简单。
3. 最为强大的是ShellExecuteEx()方式:
写一个函数:
BOOL RunExec(const TCHAR *cmd, const TCHAR*para, DWORD dwMilliseconds)
{
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize =sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask =SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb =NULL;
ShExecInfo.lpFile =cmd;
ShExecInfo.lpParameters =para;
ShExecInfo.lpDirectory =NULL;
ShExecInfo.nShow =SW_HIDE;
ShExecInfo.hInstApp =NULL;
BOOL suc =ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess, dwMilliseconds);
return suc;
}
const TCHAR* cmd接收调用的命令,const TCHAR*para接收命令后的参数,DWORD dwMilliseconds接收毫秒数,如果传入0,则该函数调用命令后立即返回,如果传入INFINITE,则函数会阻塞调用线程,直到命令完成,传入其它值例如1000,则阻塞调用线程最多1秒,调用方法例如:
RunExec(_T("cmd"), _T("/c copy d:\\111.rard:\\222.rar"), INFINITE);
属于Win32 API,调用线程阻塞与否可以控制。
优点:支持unicode,调用线程阻塞与否可以调节,调用不会出黑框。
缺点:不支持内部命令(前面加cmd /c解决)。
相关文章推荐
- 浅析C++中的system/WinExec/ShellExecute/CreateProcess
- VC启动另一个exe 同时传入参数 systerm WinExec ShellExecuteEx
- python调用Shell脚本:os.system(cmd)或os.popen(cmd)
- python调用Shell脚本:os.system(cmd)或os.popen(cmd)()【转】
- Python执行shell脚本的几种方式(最好用subprocess.Popen来替代os.system)
- shell c 混合编程 system 输出数据到变量
- python调用Shell脚本:os.system(cmd)或os.popen(cmd)
- python调用Shell脚本:os.system(cmd)或os.popen(cmd)
- WinExec() and ShellExecute() 的用法
- Mysql通过system命令调用系统shell命令
- 关于WinExec和System的比较
- system,WinExec, ShellExecute,CreateProcess 区别
- 启动计算机时,记事本启动并带有“[.ShellClassInfo] LocalizedResourceName=@%System
- system() 执行 shell 命令
- linux C程序中获取shell脚本输出(如获取system命令输出)
- SHELLEXECUTEINFO,ShellExecuteEx
- 删除svn隐藏目录SHELL命令(for windows and unix-like system)
- linux C 语言的 system(执行shell 命令)
- PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
- 使用cstdlib,system()写个伪shell