2013-07-05 3 views
4

Как я могу получить и установить переменную PATH с помощью QT 4.8? Я знаю, что могу получить значения переменной PATH, используя getenv из STL, но не знаю, как установить его с помощью STL или любого метода на основе Qt?Как установить переменную PATH с помощью QT?

Если у QT есть функция для него, я хотел бы узнать и использовать его, а не идти и использовать для этого Windows API.

ответ

3

Вы можете использовать setenv из stdlib.h для установки PATH на новое значение.

setenv("PATH","/new/path/value",1) 

Тем не менее, это нестандартное расширение стандартных заголовков, и будет влиять только суб-процессы, порожденные вызывающего процесса. Чтобы изменить переменные среды для всех новых процессов, необходимо использовать системный метод. Для окон переменная PATH может быть изменена в

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 

ключ реестра. Это позволит убедиться, что PATH установлен для всех новых процессов и будет применяться при перезагрузке.

+0

Спасибо большое :) Я не знал, что у нас есть setenv в STL !. Но знаете ли вы, если у нас есть что-то, на чем основывается Qt? если есть что-то вроде этого, я принимаю его как ответ. – Breeze

+0

Кажется, что вы можете использовать [QProcessEnviroment] (http://qt-project.org/doc/qt-4.8/qprocessenvironment.html), чтобы установить среду процессов, порожденных с помощью [QProcess] (http://qt-project.org/doc/qt-4.8/qprocess.html). – exrook

+0

Спасибо, мне нужно разрешение машины (я имею в виду, что касается всей ОС, а не самого процесса), все равно мне все равно придется идти? – Breeze

2

Я работал со значением Registry с помощью этого кода:

включают:

#include <windows.h> 

Для чтения:

QSettings setting("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment", QSettings::NativeFormat); 
QString pathVal = setting.value("Path", "no-path").toString(); 

Чтобы написать:

setting.setValue("Path", path); 
SendMessageA(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment"); 

Таким образом, я получаю фактическое значение Path без перезагрузки программы и записываю значение, передающее изменение всем процессам.

Не знаю, как использовать SendMessage от этого ответа:
How to modify the PATH variable definitely through the command line in Windows.
Я думал, что должен создать приложение Win32 в Visual Studio, а затем отправить это сообщение внутри него.

Но эту функцию следует вызывать сразу после изменения реестра. Поэтому я могу вручную отредактировать значение реестра, а затем нажать кнопку, которая называется SendMessageA и обновлена ​​Path.


Кстати, есть SendMessage макрос, который вызывает SenMessageW функцию, но она не работает и Path не изменилась. Не знаю, что означает A, но он меняет переменную.

8

Благодаря моему другу г-ну Тоози вы можете установить переменную окружения для текущего процесса с помощью qputenv("key", "value") и получить его с помощью qgetenv("key").
Это тоже работает на Qt 5.5.0 :)