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的用法和区别的主要内容,如果未能解决你的问题,请参考以下文章

急急急~~~VS2010中QT插件运行不了!!!~~~

qt 中Qtable widget中如何加一个表

如何在qt中执行opengl

如何在 Qt5 中播放声音(Qt4 迁移)?

qt中怎么改变按钮的形状

在 Visual Studio 中使用 Qt 远程对象(带有 qt 插件)