前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决QProcess使用setProcessEnvironment环境变量不能生效的问题

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

作者头像
Qt君
发布2019-07-16 10:52:35
2.5K0
发布2019-07-16 10:52:35
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程

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

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

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

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

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

为什么会这样?

  • 先看下列源代码:
代码语言:javascript
复制
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设置。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 不能正确使用环境变量的代码
  • 可以正确设置环境变量的代码
  • 为什么会这样?
  • 怎么正确设置可执行文件的环境变量?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档