如何在C++中添加环境变量?

9

有没有办法通过C++在Windows中添加环境变量?

它们必须添加在“我的电脑->属性->高级->环境变量”中

谢谢


1
@Aamir:OP说“在Windows中”。你的链接仅适用于运行进程。另请参阅Felice Pollano的回复,该回复做出了相同的(我认为是错误的)假设。 - 0xC0000022L
6个回答

12

来自MSDN

要以编程方式添加或修改系统环境变量,请将其添加到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment注册表键中,然后广播一个带有lParam设置为字符串"Environment"的WM_SETTINGCHANGE消息。这允许应用程序(如shell)获取您的更新...


有没有其他方法可以不使用注册表? - Ram
@code9215:目前还没有,但如果你找到了一个,你应该写一个答案。 - 0xC0000022L
系统是全局设置。那么加上用户设置怎么样? - winux

3
这里是一个简单的实现(基于SteelBytes发布的MSDN指令):
bool SetPermanentEnvironmentVariable(LPCTSTR value, LPCTSTR data)
{
    HKEY hKey;
    LPCTSTR keyPath = TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Environment");
    LSTATUS lOpenStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyPath, 0, KEY_ALL_ACCESS, &hKey);
    if (lOpenStatus == ERROR_SUCCESS) 
    {
        LSTATUS lSetStatus = RegSetValueEx(hKey, value, 0, REG_SZ,(LPBYTE)data, strlen(data) + 1);
        RegCloseKey(hKey);

        if (lSetStatus == ERROR_SUCCESS)
        {
            SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_BLOCK, 100, NULL);
            return true;
        }
    }

    return false;
}

3
我知道的唯一方法是通过注册表。
提示:全局变量在 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 中,每个用户的变量在HKEY_USERS\*\Environment中,其中*代表用户的SID。
祝你好运。

在独立的调研后,我找到了这个最简单的机制。只需记住,在更新路径环境变量之前存在的每个进程,可能会或可能不会如预期般响应您在更新后应该发送的消息。也就是说,更改可能仅适用于新的进程。 - dyasta

2

你尝试过在C++中设置本地环境变量


值得注意的是,使用putenv(或Windows中的_putenv)创建的环境变量在创建它们的程序退出后不会持久存在(因为单词“local”表示本地)。+1,因为如果您只需要在程序生命周期内保留环境变量,则此解决方案可以解决问题。 - Ben

-1

1
他想要全局设置变量;这个函数仅适用于当前进程。 - SLaks
我认为您还没有阅读该函数的文档。该函数可以设置变量为“Process”、“User”或“Machine”。您可以通过传递targer = EnvironmentVariableTarget.Machine来在机器级别上执行此操作。 - Tayyab
这是一个C#的函数;他在问关于C++的。 - SLaks
如果您不同意,那没什么好说的。我不会再作进一步评论。只有最后一件事情需要提供给您的信息。该方法可从C++、C#、VB和F#中调用(请参见提供的链接以获取所有语言的示例代码)。我同意该函数是Framework的一部分,而不是Win32的一部分,但所问问题并不要求如此。问题只是说“在Windows上使用C++”。我猜您没有认真阅读问题。无论如何,祝你玩得开心!! :) - Tayyab
“C++ on Windows” 无法调用 .Net 方法。(很少有人使用 C++/CLI) - SLaks
显示剩余2条评论

-1
#include <iostream>
#include <windows.h>
#include <cstring>
#include "tchar.h"


void SetUserVariablePath(){
    HKEY hkey;
    long regOpenResult;
    const char key_name[] = "Environment";
    const char path[]="D:/custom_command";                                               //new_value path need to update 
    regOpenResult = RegOpenKeyEx(HKEY_CURRENT_USER,key_name, 0, KEY_ALL_ACCESS, &hkey);
    LPCSTR stuff = "VVS_LOGGING_PATH";                                                   //Variable Name 
    RegSetValueEx(hkey,stuff,0,REG_SZ,(BYTE*) path, strlen(path));
    RegCloseKey(hkey);
}



void GetUserVariablePath(){
    static const char path[] = "VVS_LOGGING_PATH" ;                                      //Variable Name 
    static BYTE buffer1[1000000] ;
    DWORD buffsz1 = sizeof(buffer1) ;
    {
        //HKEY_CURRENT_USER\Environment
        const char key_name[] = "Environment";
        HKEY key ;

        if( RegOpenKeyExA( HKEY_CURRENT_USER, key_name, 0, KEY_QUERY_VALUE, std::addressof(key) ) == 0 &&
            RegQueryValueExA( key, path, nullptr, nullptr, buffer1, std::addressof(buffsz1) ) == 0 )
        {
            std::cout << "The updated value of the user variable is :  " << reinterpret_cast<const char*>(buffer1) << '\n' ;
        }
    }
}

int main()
{   
    SetUserVariablePath();
    GetUserVariablePath();
    return 0;
}

欢迎来到 Stack Overflow。如果您能解释一下为什么您的答案比已有的更好,那就太好了。 - Angel F Syrus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接