解决QProcess使用setProcessEnvironment环境变量不能生效的问题

使用QProcess运行进程时,为了方便使用运行程序,直接使用程序名字运行。但是这时候需要设置环境变量。可是使用 setProcessEnvironment怎么设置也不能设置成功。运行QProcess却是一直返回'文件找不到'的现象。下面让我们来窥探究竟吧。

不能正确使用环境变量的代码

QProcess* myProcess = new QProcess(this);
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("PATH", "C:/AppPath;" + env.value("PATH"));
myProcess->setProcessEnvironment(env);
myProcess->start("App.exe");

可以正确设置环境变量的代码

QProcess* myProcess = new QProcess(this);
QString path = "C:/AppPath;" + qgetenv("PATH");
qputenv("PATH", path.toStdString().c_str());
myProcess->setProcessEnvironment(env);
myProcess->start("App.exe");

为什么会这样?

  • 先看下列源代码:
bool QProcessPrivate::callCreateProcess(QProcess::CreateProcessArguments *cpargs)
{
    if (modifyCreateProcessArgs)
        modifyCreateProcessArgs(cpargs);
    bool success = CreateProcess(cpargs->applicationName, cpargs->arguments,
                                 cpargs->processAttributes, cpargs->threadAttributes,
                                 cpargs->inheritHandles, cpargs->flags, cpargs->environment,
                                 cpargs->currentDirectory, cpargs->startupInfo,
                                 cpargs->processInformation);
    if (stdinChannel.pipe[0] != INVALID_Q_PIPE) {
        CloseHandle(stdinChannel.pipe[0]);
        stdinChannel.pipe[0] = INVALID_Q_PIPE;
    }
    if (stdoutChannel.pipe[1] != INVALID_Q_PIPE) {
        CloseHandle(stdoutChannel.pipe[1]);
        stdoutChannel.pipe[1] = INVALID_Q_PIPE;
    }
    if (stderrChannel.pipe[1] != INVALID_Q_PIPE) {
        CloseHandle(stderrChannel.pipe[1]);
        stderrChannel.pipe[1] = INVALID_Q_PIPE;
    }
    return success;
}
  • QProcess底层调用的是Window系统 CreateProcess接口,但是该调用是为了获取可执行文件的完整路径或相对于当前工作目录的路径。
  • 虽然它确实改变了生成过程的环境, 但是却无法设置搜索可执行文件的环境。

怎么正确设置可执行文件的环境变量?

  • 使用 qgetenvqputenv设置。

原文发布于微信公众号 - Qt君(qtjuna)

原文发表时间:2019-05-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券