在 C++ 中使用 RegSetValueEx() 附加到用户环境变量
Append to a User Environment Variable with RegSetValueEx() in C++
我想使用 C++ 将新路径附加到现有环境变量。这应该是针对当前用户的(如果您可以提供 Local_Machine 的示例,那也是可以接受的)。
路径(新建)和变量(已经存在)是
variable = Cur
path = E:\Softwares\Setup
我试过的
void SetUserVariablePath(){
HKEY hkey;
long regOpenResult;
const char key_name[] = "Environment";
const char path[]="E:\Softwares\Setup;"; //new path
LPCSTR stuff = "Cur"; //Variable Name
// here we open the variable and set the value
regOpenResult = RegOpenKeyEx(HKEY_CURRENT_USER,key_name, 0, KEY_ALL_ACCESS, &hkey);
RegSetValueEx(hkey,stuff,0,REG_EXPAND_SZ,(BYTE*) path, strlen(path)+1);
// tell other process to update their env values
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_BLOCK, 100, NULL);
// close the registery key
RegCloseKey(hkey);
}
我已遵循 how-to-add-environment-variable-in-c 上面的 code.The 代码确实有效并为当前用户设置了环境变量,但它也覆盖了任何现有的路径, 我想做的是附加到现有路径.
没有回答我的问题的事情
- 我不打算为 current/child 进程设置变量(可以使用 setenv() 或 _putenv() 函数完成)。
- 我已经看过这些问题,但它们没有回答我的问题。 Update system environment variable from c++ and Set system variable from C++
我跟进了@john 的建议,得到了如下的工作代码
void appendReg()
{
// commons
static const char sysVar[] = "Cur" ; // Variable Name
const char key_name[] = "Environment";
// first read the current value of registery
static BYTE curRegVal[1000000]; // will store the reg value
DWORD curRegValCP = sizeof(curRegVal) ;
HKEY readKey;
RegOpenKeyExA( HKEY_CURRENT_USER, key_name, 0, KEY_QUERY_VALUE, &readKey);
RegQueryValueExA( readKey, sysVar, nullptr, nullptr, curRegVal, &curRegValCP);
RegCloseKey(readKey);
// curRegVal now has the current reg value
std::cout<<"\nCurrent Reg value is = > "<< reinterpret_cast<const char*>(curRegVal);
// second append the new path value to current value
const char appendedVal[1000000]="C:\New\Dir\To\Be\Appended;"; // to be appended
strcat(appendedVal,curRegVal); // concatenate the current and new values
std::cout<<"\nAppended Reg value is => "<<appendedVal;
// third set the new(appended) value for registery and broadcast changes to other processes
HKEY writeKey;
RegOpenKeyEx(HKEY_CURRENT_USER,key_name, 0, KEY_ALL_ACCESS, &writeKey);
RegSetValueEx(writeKey,(LPCSTR)sysVar,0,REG_EXPAND_SZ,(BYTE*) appendedVal, strlen(appendedVal)+1);
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)key_name, SMTO_BLOCK, 100, NULL); // tell other process to update their env values
RegCloseKey(writeKey);
}
这会将新路径附加到当前用户的环境变量。
我想使用 C++ 将新路径附加到现有环境变量。这应该是针对当前用户的(如果您可以提供 Local_Machine 的示例,那也是可以接受的)。
路径(新建)和变量(已经存在)是
variable = Cur
path = E:\Softwares\Setup
我试过的
void SetUserVariablePath(){
HKEY hkey;
long regOpenResult;
const char key_name[] = "Environment";
const char path[]="E:\Softwares\Setup;"; //new path
LPCSTR stuff = "Cur"; //Variable Name
// here we open the variable and set the value
regOpenResult = RegOpenKeyEx(HKEY_CURRENT_USER,key_name, 0, KEY_ALL_ACCESS, &hkey);
RegSetValueEx(hkey,stuff,0,REG_EXPAND_SZ,(BYTE*) path, strlen(path)+1);
// tell other process to update their env values
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_BLOCK, 100, NULL);
// close the registery key
RegCloseKey(hkey);
}
我已遵循 how-to-add-environment-variable-in-c 上面的 code.The 代码确实有效并为当前用户设置了环境变量,但它也覆盖了任何现有的路径, 我想做的是附加到现有路径.
没有回答我的问题的事情
- 我不打算为 current/child 进程设置变量(可以使用 setenv() 或 _putenv() 函数完成)。
- 我已经看过这些问题,但它们没有回答我的问题。 Update system environment variable from c++ and Set system variable from C++
我跟进了@john 的建议,得到了如下的工作代码
void appendReg()
{
// commons
static const char sysVar[] = "Cur" ; // Variable Name
const char key_name[] = "Environment";
// first read the current value of registery
static BYTE curRegVal[1000000]; // will store the reg value
DWORD curRegValCP = sizeof(curRegVal) ;
HKEY readKey;
RegOpenKeyExA( HKEY_CURRENT_USER, key_name, 0, KEY_QUERY_VALUE, &readKey);
RegQueryValueExA( readKey, sysVar, nullptr, nullptr, curRegVal, &curRegValCP);
RegCloseKey(readKey);
// curRegVal now has the current reg value
std::cout<<"\nCurrent Reg value is = > "<< reinterpret_cast<const char*>(curRegVal);
// second append the new path value to current value
const char appendedVal[1000000]="C:\New\Dir\To\Be\Appended;"; // to be appended
strcat(appendedVal,curRegVal); // concatenate the current and new values
std::cout<<"\nAppended Reg value is => "<<appendedVal;
// third set the new(appended) value for registery and broadcast changes to other processes
HKEY writeKey;
RegOpenKeyEx(HKEY_CURRENT_USER,key_name, 0, KEY_ALL_ACCESS, &writeKey);
RegSetValueEx(writeKey,(LPCSTR)sysVar,0,REG_EXPAND_SZ,(BYTE*) appendedVal, strlen(appendedVal)+1);
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)key_name, SMTO_BLOCK, 100, NULL); // tell other process to update their env values
RegCloseKey(writeKey);
}
这会将新路径附加到当前用户的环境变量。