在我的应用程序中,当我第一次使用RegSetValueEx()设置键值时,它可以工作,但是当我尝试使用相同的函数更改值时它不起作用,值保持不变。我做错了什么?
以下是代码:
SetSZValue( "MyAppData", "versionInfo", "1.0.0" );
HKEY CreateKey( string regkey )
{
HKEY hKey ;
DWORD disValue ;
char msg[512] ;
string _key = "HKEY_LOCAL_MACHINE\\" ;
_key += regkey ;
LONG retValue = RegCreateKeyEx( HKEY_LOCAL_MACHINE, regkey.c_str(), 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hKey, &disValue ) ;
if (retValue != ERROR_SUCCESS)
{
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, &msg[0], 512, 0 ) ;
MessageBox( 0, &msg[0], "CreateKey", MB_OK | MB_ICONEXCLAMATION );
}
return hKey ;
}
void SetSZValue( string regkey, string keyName, string keyValue )
{
HKEY hKey;
DWORD disValue;
char msg[512];
hKey = CreateKey(regkey);
if (hKey)
{
LONG retValue = RegSetValueEx( hKey, keyName.c_str(), 0, REG_SZ, ( const BYTE* )( keyValue.c_str() ), keyValue.size()+1 );
if ( retValue != ERROR_SUCCESS )
{
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, &msg[0], 512, 0 );
MessageBox( 0, &msg[0], "SetSZValue", MB_OK | MB_ICONEXCLAMATION );
}
RegCloseKey ( hKey );
}
}
答案 0 :(得分:1)
RegSetValueEx
接受要更改的键内值的名称;不是钥匙的名称。改为提供值名称;密钥名称来自HKEY
本身。
答案 1 :(得分:1)
您的应用是否是在64位Windows版本上运行的32位进程?如果是这样,您的应用是否有一个UAC清单,其中包含“requestedExecutionLevel”值?如果没有,您的密钥可能会被虚拟化到注册表的另一部分,而您根本就没有找到正确的位置。 Registry Virtualization是WOW64的一个功能,因此传统的32位和64位进程不会在注册表中相互跳过。您应该安装SysInternals Process Monitor,它会显示您的应用实际访问的键和值。