void Process::setEnvironment(const ProcessEnvironment &e) { QProcessEnvironment qpenv; for (ProcessEnvironment::const_iterator it = e.constBegin(); it != e.constEnd(); ++it) qpenv.insert(it.key().toQString(), it.value()); QProcess::setProcessEnvironment(qpenv); }
static QByteArray createEnvBlock(const ProcessEnvironment &environment) { QByteArray envlist; if (!environment.isEmpty()) { ProcessEnvironment copy = environment; const QString pathKey(QLatin1String("Path")); if (copy.contains(pathKey)) { // PATH has been altered. // It must be set in this environment to start the correct executable. // ### Note that this doesn't work if a batch file is supposed to shadow an exe or com. if (!qSetEnvironmentVariable(pathKey, environment.value(pathKey))) qWarning("jom: setting PATH failed"); } else { // add PATH (for DLL loading) QString path = qGetEnvironmentVariable(L"PATH"); if (!path.isEmpty()) copy.insert(pathKey, path); } // add systemroot if needed const ProcessEnvironmentKey rootKey(QLatin1String("SystemRoot")); if (!copy.contains(rootKey)) { QString systemRoot = qGetEnvironmentVariable(L"SystemRoot"); if (!systemRoot.isEmpty()) copy.insert(rootKey, systemRoot); } int pos = 0; ProcessEnvironment::const_iterator it = copy.constBegin(); const ProcessEnvironment::const_iterator end = copy.constEnd(); static const wchar_t equal = L'='; static const wchar_t nul = L'\0'; for ( ; it != end; ++it) { const QString &keystr = it.key().toQString(); uint tmpSize = sizeof(wchar_t) * (keystr.length() + it.value().length() + 2); // ignore empty strings if (tmpSize == sizeof(wchar_t) * 2) continue; envlist.resize(envlist.size() + tmpSize); tmpSize = keystr.length() * sizeof(wchar_t); memcpy(envlist.data() + pos, keystr.utf16(), tmpSize); pos += tmpSize; memcpy(envlist.data()+pos, &equal, sizeof(wchar_t)); pos += sizeof(wchar_t); tmpSize = it.value().length() * sizeof(wchar_t); memcpy(envlist.data()+pos, it.value().utf16(), tmpSize); pos += tmpSize; memcpy(envlist.data()+pos, &nul, sizeof(wchar_t)); pos += sizeof(wchar_t); } // add the 2 terminating 0 (actually 4, just to be on the safe side) envlist.resize( envlist.size()+4 ); envlist[pos++] = 0; envlist[pos++] = 0; envlist[pos++] = 0; envlist[pos++] = 0; } return envlist; }