system WinExec ShellExecuteEx

system WinExec ShellExecuteExwindows编程的时候经常需要调用操作系统提供的命令,比如调用netuser命令可以在系统中新建一个用户等。    1.最简单的调用方法就是使用函数system(),例如    system(“copyd:\\1.rard:\\2.rar”);    属于CRuntimeLibrary,调用该函数会阻塞调用线程。    优点:简单方便,既

大家好,又见面了,我是你们的朋友全栈君。

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解决)。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157519.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Ubuntu 22.04 LTS 新系统环境配置[通俗易懂]

    Ubuntu 22.04 LTS 新系统环境配置[通俗易懂]目录一、安装wps二、截图工具flameshot三、必备中文输入法fcitx-googlepinyin安装四、python3环境五、解决ssh环境恢复遇到问题搜索wpslinux版本,下载到最新版本,进入到deb包下载目录,执行安装命令。WPSOffice2019forLinux-支持多版本下载_WPS官方网站WPSOfficeForLinux,支持不同格式多版本WPSForLinux版下载,实现多人在线协同办公。https://linux.wps.cn/sudodpkg-ixxx

  • android退出app的方法,Android 实现彻底退出自己APP 并杀掉所有相关的进程[通俗易懂]

    android退出app的方法,Android 实现彻底退出自己APP 并杀掉所有相关的进程[通俗易懂]彻底杀掉App相关进程的代码publicvoidkillAppProcess(){//注意:不能先杀掉主进程,否则逻辑代码无法继续执行,需先杀掉相关进程最后杀掉主进程ActivityManagermActivityManager=(ActivityManager)CurrentActivity.this.getSystemService(Context.ACTIVITY_SERVIC…

  • Ansible-playbook_黑莓playbook刷中文教程

    Ansible-playbook_黑莓playbook刷中文教程Ansible入门与playbook实战

  • 角速度与位移矢量叉乘_角速度叉乘角动量

    角速度与位移矢量叉乘_角速度叉乘角动量矢量导数——角速度与矢量的叉乘原创不易,路过的各位大佬请点个赞矢量叉乘,向量外积矢量导数——角速度与矢量的叉乘1.定理证明证明结论部分1.定理矢量的导数为角速度叉乘以该适量。这也是角速度的定义。角速度在一般意义上是一个二阶张量,不过由于这个张量满足某些约束条件,自由的分量个数恰好变成了3个,所以正好可以拼凑成一个三分量矢量。刚体绕定轴旋转时,角速度矢量的方向垂直于旋转平面,且按右手螺旋法则确定证明定义矢量在本体坐标系表示为rar_ara​,在旋转坐标系的表示为rbr_brb​,两个坐

    2022年10月26日
  • Vue中,methods中调用filters里的过滤器

    Vue中,methods中调用filters里的过滤器需求:vue中,除了在模板中使用过滤器,有时候,methods中也需要使用filters中的过滤器! this.$options.filters[filter](…args)//这种方法很简单,也很实用打印 this.$options.filters报错,打印this.$options.filters.myFilter正常,显示为一个function原文地址:https:/…

  • 低通滤波器matlab代码_matlab设计fir低通滤波器

    低通滤波器matlab代码_matlab设计fir低通滤波器##一、获取代码方式**获取代码方式1:**完整代码已上传我的资源:[【滤波器】基于matlab低通滤波器(LPF)设计【含Matlab源码323期】](https://download.csdn.net/download/TIQCmatlab/31349826)

    2022年10月28日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号