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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决BASE64Encoder报错的问题

    解决BASE64Encoder报错的问题今天在用servlet写一个文件下载的案例时,想解决文件的中文显示问题。然后在导包importsun.misc.BASE64Encoder时,发现IDEA报错了,无法识别这个类。最后发现在JDK9后,官方就已经不支持importsun.misc.BASE64Encoder了。网上说了很多,第一种是把JDK的版本降低到1.8以内。但是我觉得这不是解决的最好办法。我觉得应该去修改原有的代码。所以我采用了官方提供了新的jar包importjava.util.Base64。下面这个java类的本意

    2022年6月15日
    52
  • 中介效应分析与路径分析的区别_完全中介效应

    中介效应分析与路径分析的区别_完全中介效应这篇文章主要是介绍中介效应分析及路径分析的概念,以及操作步骤,注意事项。好多内容就是拷贝的邱皓政老师的《量化研究与统计分析:SPSS(PASW)数据分析范例解析》第12章节,然后在中间加入了少部分自己看的过程的一些理解吧。1.中介效应分析从上述的阐述可以知道,中介效应分析其实就是有一个变量充当了中介变量,X->Y是通过中介变量Z来传递影响的。如果是完全中介效应就是完全由Z来传递影…

    2022年8月24日
    7
  • touchesBegan: withEvent: 不执行/完美收起键盘

    touchesBegan: withEvent: 不执行/完美收起键盘eg:写一个category类目 UIScrollView+Event-(void)touchesBegan:(NSSetUITouch*>*)toucheswithEvent:(UIEvent*)event{  [supertouchesBegan:toucheswithEvent:event];  [[[selfnext

    2022年7月25日
    10
  • 推荐几个免费看动漫的网站

    推荐几个免费看动漫的网站相信很多喜欢看动漫的网友都有过想看番却找不到资源的经历,尤其是刚入宅的萌新,想看却又看不到的感觉很痛苦把,那么今天就给大家介绍几个好用的追番网站。1.bilibibilibili是国内知名的视频弹幕网站,这里有最及时的动漫新番,最棒的ACG氛围,最有创意的Up主。2.樱花动漫:种类很全,基本都没有圣光,很多人都喜欢用这个网站看番,非常nice3.bimibimi:M站4.zzzfuu:z站,种类很全:5.m.qixu8.cn一款手机端在线追番的网……

    2022年7月18日
    63
  • cmd里进入某个目录_cmd进入文件目录

    cmd里进入某个目录_cmd进入文件目录1.开始->运行->CMD2.进入某个磁盘,直接盘符代号:如D:,不用CD命令切换3.进入除根录以下的文件夹cd文件夹路径例如我要进入E:/ProgramFiles/PHP就输入E:回车 注:不能在一打开CMD的时候运行CDE:/ProgramFiles/PHP,需要先进入磁盘(若一打开CMD的时候运行CDE:/ProgramFiles/PHP,目

    2022年10月10日
    3
  • Python 文件操作

    Python 文件操作

    2021年8月21日
    346

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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