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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 最小二乘法求回归方程的推导[通俗易懂]

    最小二乘法求回归方程的推导[通俗易懂]这里手写的最小二乘法​​​​​​​的推导过程。  

    2025年8月1日
    5
  • MD5加密概述,原理及实现

    MD5加密概述,原理及实现MD5概述:MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要(32位的数字字母混合码)。MD5主要特点:不可逆,相同数据的MD5值肯定一样,不同数据的MD5值不一样(一个MD5理论上的确是可能对应无数多个原文的,因为MD5是有限多个的而原文可以是无数多个。比如主流使用的MD5将任意长度的“字节串映射为一个128bit的大整数…

    2022年7月11日
    23
  • MySQL数据库:存储过程Procedure

    MySQL数据库:存储过程Procedure

    2021年10月4日
    60
  • 维度建模——数据仓库初步[通俗易懂]

    维度建模——数据仓库初步[通俗易懂]本文是《维度建模》后续文章的基础。我们首先从宏观层面上考察数据仓库和商业智能(DataWarehousingandBusinessIntelligence,DW/BI)系统。DW/BI系统首先应该仔细考虑的问题是业务需求。《维度建模》系列文章将紧紧抓住业务需求这一要点,逐步深入探讨逻辑设计、物理设计以及采用有关技术和工具的决策等问题。本文将详细考察数据仓库及商业智能的主要目标,辨析DW/…

    2022年5月7日
    48
  • 【漏洞挖掘】QQ钓鱼网站实战渗透[通俗易懂]

    【漏洞挖掘】QQ钓鱼网站实战渗透[通俗易懂]渗透实战,通过报错注入拿到后台账号密码。

    2022年8月24日
    9
  • IDEA 注释详解[通俗易懂]

    IDEA 注释详解[通俗易懂]IDEA注释及模板配置1.行注释ctrl+/2.块注释(多行),取消注释时不用选中多行,只需要在开始符号/*那里执行ctrl+shift+/3.方法和类注释/**+回车方法会直接返回带参数的注释,如下,但是类上信息为空/****@paramuser*/4.配置类和方法的注释模板ctrl+alt+…

    2022年9月28日
    2

发表回复

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

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