Qt Windows使用管理员权限运行Cmd

在Qt跨平台开发中,在Windows平台上经常有开启新的进程来执行任务的情况,这里又分为2种,一种是不需要超级管理员权限的,可以直接使用QProcess来完成;还有一种就是需要管理员权限来执行一些脚本。

比如现在想在软件打开时修改注册表,bat脚本如下:

bash 复制代码
@echo "auto create dump"
echo Yes | reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
echo Yes | reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\FTIRDasAnalyzer.exe"
echo Yes | reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\FTIRDasAnalyzer.exe" /v DumpFolder /t REG_EXPAND_SZ /d "C:\DumpFile" /f
echo Yes | reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\FTIRDasAnalyzer.exe" /v DumpType /t REG_DWORD /d 2 /f
echo Yes | reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\FTIRDasAnalyzer.exe" /v DumpCount /t REG_DWORD /d 10 /f

这时需要使用Windows平台的API,先加上windows.h头文件:

arduino 复制代码
#include <windows.h>

然后使用SHELLEXECUTEINFO相关API即可:

ini 复制代码
void UACrunProcess(QString Path) {
    QFile file(Path);
    if (!file.exists()) {
        logWarn() << "create dump bat path is not exists";
        return;
    }
    std::wstring wstr = Path.toStdWString();
    const wchar_t* filePtr = wstr.c_str();

    SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
    sei.lpVerb = TEXT("runas");
    sei.lpFile = filePtr;
    sei.nShow = SW_SHOWNORMAL;//without this,the windows will be hiden
//    sei.nShow = SW_HIDE;
    if (!ShellExecuteEx(&sei)) {
        DWORD dwStatus = GetLastError();
        if (dwStatus == ERROR_CANCELLED) {
            logWarn() << "bat execute canceld";
        } else if (dwStatus == ERROR_FILE_NOT_FOUND) {
            logWarn() << "bat execute not found execute file";
        }
    }
}

上面代码比较简单,但是有几点需要注意:

  • 对于QString类型的字符串,需要转换为wchar_t*类型。
  • 在启动Qt Creator时必须以管理员权限启动。
  • 在执行过程中,可以通过echo Yes | ...的方式给指令在执行时赋默认值,否则黑色的命令行弹窗不会消失,会影响美观或者升级等操作。
相关推荐
Smile丶凉轩3 小时前
Qt 界面优化(绘图)
开发语言·数据库·c++·qt
charlie1145141919 小时前
基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Adapter文档
arm开发·qt·学习·pdf·教程·设计·qt6
电信2301杨臣10 小时前
QT---信号与槽
开发语言·qt
范纹杉想快点毕业13 小时前
以项目的方式学QT开发(一)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
c语言·数据结构·c++·git·qt·链表·github
钢铁男儿14 小时前
PyQt 探索QMainWindow:打造专业的PyQt5主窗
python·qt·pyqt
破晓的历程18 小时前
Qt file文件操作详解
开发语言·qt
躺着听Jay20 小时前
QT设置MySQL驱动
数据库·qt
范纹杉想快点毕业21 小时前
以项目的方式学QT开发(三)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
c语言·开发语言·c++·qt·mysql·算法·命令模式
机器视觉知识推荐、就业指导1 天前
Qt/C++面试【速通笔记九】—视图框架机制
c++·笔记·qt