qt中ShellExecute、ShellExecuteEx和WinExec的用法和区别

86 篇文章 1 订阅

今天我要介绍的是支持管理员权限的启动进程的几种方式。
分别是ShellExecute,ShellExecuteEx,WinExec。
它们的各自特点:
ShellExecute:是通过windows外壳打开任意文件,非可执行文件自动通过关联的程序打开,对于可执行文件,区别不大,不过shellexcute可以指定运行时的工作路径
ShellExecuteEx:它跟ShellExecute差不多,区别在于它的返回值和支持阻塞运行。
WinExec:只用于可执行文件,是一个老函数啦,虽然使用方便,但兼容性也不好。

ShellExecute使用方式:

filename = "xxx.exe";

std::wstring operate;
if (info.installAuth == 0)//有管理员权限
     operate = QString("runas").toStdWString();
else//没有管理员权限
     operate = L"open";
std::wstring file = QString("\"" + filename  + "\""). toStdWString();//执行文件
        
filename = filename.left(filename.size()-QString(filename.split("/").last()).size());//获取执行文件路径
std::wstring path = filename.toStdWString();//执行文件路径。
        
QString para = ”1“;//参数1
QString para2 = “test”;//参数2
QString tmp = para+“ ”+para2;
std::wstring lpParameters = tmp.toStdWString();//合并参数

int ret = (int)ShellExecute(NULL,operate.c_str(), file.c_str(),lpParameters.c_str(),path.c_str(),SW_SHOWNORMAL);
QString sRet;
switch(ret)
{
case 0:
        sRet = QString("memory lack.");
        break;
case 2:
        sRet = QString("filename is error.");
        break;
case 3:
        sRet = QString("file path is error.");
        break;
case 11:
        sRet = QString("exe is invaliable.");
        break;
case 26:
        sRet = QString("shared error.");
        break;
case 27:
        sRet = QString("file is error or be short.");
        break;
case 28:
        sRet = QString("open time out.");
        break;
case 29:
        sRet = QString("DDE task failed.");
        break;
case 30:
        sRet = QString("undering other's DDE");
        break;
case 31:
        sRet = QString("no linked process.");
        break;
default:
        sRet = QString("unknow error.");
        break;
    }

if(ret <= 32){//返回值大于32表示ShellExecute执行成功
}
else{
}

ShellExecuteEx使用方式:

filename = "xxx.exe";

std::wstring operate;
if (info.installAuth == 0)//有管理员权限
     operate = QString("runas").toStdWString();
else//没有管理员权限
     operate = L"open";
std::wstring file = QString("\"" + filename  + "\""). toStdWString();//执行文件
        
filename = filename.left(filename.size()-QString(filename.split("/").last()).size());//获取执行文件路径
std::wstring path = filename.toStdWString();//执行文件路径。
        
QString para = ”1“;//参数1
QString para2 = “test”;//参数2
QString tmp = para+“ ”+para2;
std::wstring lpParameters = tmp.toStdWString();//合并参数

SHELLEXECUTEINFO shExecinfo = {0};//创建执行文件对象
shExecinfo.cbSize = sizeof(SHELLEXECUTEINFO);//结构大小
shExecinfo.fMask = SEE_MASK_NOCLOSEPROCESS;
shExecinfo.hwnd = NULL;//父窗口句柄
shExecinfo.lpVerb = operate.c_str();//权限
shExecinfo.lpFile = file.c_str();//执行文件
shExecinfo.lpParameters = lpParameters.c_str();//参数
shExecinfo.lpDirectory = path.c_str();//路径
shExecinfo.nShow = SW_SHOWNORMAL;//显示方式
shExecinfo.hInstApp = NULL;
int ret = (int)ShellExecuteEx(&shExecinfo);
if (ret == 0)//执行失败
{}
else//执行成功
{}

WaitForSingleObject(shExecinfo.hProcess, INFINITE);//阻塞,直到ShellExecuteEx()执行的程序关闭

WinExec使用方式:

WinExec("cmd /c xxx.exe",SW_HIDE);//直接执行,和system()类似,只不过system()执行的cmd不带管理员权限
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方忘忧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值