system WinExec ShellExecuteEx

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解决)。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值