qt中ShellExecuteShellExecuteEx和WinExec的用法和区别
Posted 东方忘忧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt中ShellExecuteShellExecuteEx和WinExec的用法和区别相关的知识,希望对你有一定的参考价值。
今天我要介绍的是支持管理员权限的启动进程的几种方式。
分别是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不带管理员权限
以上是关于qt中ShellExecuteShellExecuteEx和WinExec的用法和区别的主要内容,如果未能解决你的问题,请参考以下文章