我有许多要运行的批处理文件,这些文件取决于环境变量。到目前为止,环境变量的设置已手动完成。我希望通过运行VC ++程序来自动计算设置并更新环境变量。
问题:
当VC ++程序运行时,它仅获得环境的副本。我可以成功设置变量,但是在程序退出时它们会丢失。
然后我使用Regxxx函数将设置写入“ HKEY_CURRENT_USER \ Environment”中,然后输入
rStat = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,(LPARAM)"Environment",SMTO_ABORTIFHUNG, 5000, &dwReturnVal);
这将报告成功,并且可以使用regedit检查更改。但是,如果我启动新的cmd.exe Shell,则环境尚未更新。
如果我使用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);