设置用户环境变量

时间:2019-07-28 08:37:40

标签: winapi visual-c++

我有许多要运行的批处理文件,这些文件取决于环境变量。到目前为止,环境变量的设置已手动完成。我希望通过运行VC ++程序来自动计算设置并更新环境变量。

问题:

  1. 当VC ++程序运行时,它仅获得环境的副本。我可以成功设置变量,但是在程序退出时它们会丢失。

  2. 然后我使用Regxxx函数将设置写入“ HKEY_CURRENT_USER \ Environment”中,然后输入 rStat = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,(LPARAM)"Environment",SMTO_ABORTIFHUNG, 5000, &dwReturnVal);

    这将报告成功,并且可以使用regedit检查更改。但是,如果我启动新的cmd.exe Shell,则环境尚未更新。

  3. 如果我使用SystemPropertiesAdvanced工具进行检查,则会看到新值,并在退出新的cmd.exe shell后看到它们。

Microsoft文档说广播消息应该使更改被识别,但是不起作用。

任何建议都深表感谢。

TCHAR newName[] = _T("cock of the walk");
DWORD newNameSize = sizeof(newName);
HKEY hKey;
LSTATUS stat;
stat = RegCreateKey(HKEY_CURRENT_USER, _T("Environment"), &hKey);
if (stat == ERROR_SUCCESS)
{
    TCHAR val[200];
    DWORD bufsiz = 100;
    stat = RegGetValue(hKey, NULL, _T("donkeykong"), RRF_RT_REG_SZ, NULL, val, &bufsiz);
    if ((stat == ERROR_SUCCESS) || (stat = ERROR_FILE_NOT_FOUND))
    {
        stat = RegSetKeyValue(hKey, NULL, _T("donkeykong"), REG_SZ, newName, newNameSize);
        DWORD_PTR dwReturnVal;
        LRESULT rStat;
        rStat = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment",
            SMTO_ABORTIFHUNG, 5000, &dwReturnVal);
        std::cout << "Bye" << std::endl;
    }
    stat = RegCloseKey(hKey);

0 个答案:

没有答案