C++操作注册表

HKEY的值:

HKEY_LOCAL_MACHINE:与机器相关的属性,所有用户共用的属性。例如开机启动就在这里。

HKEY_CURRENT_USER:与用户相关的属性,可能只有用户特有。例如开机启动就在这里。

 

REG_OPTION_VOLATILE:这个参数的意思是创建的注册表键值都位于内存中,不会保存到相应的注册表文件中重启后这些键值当然就没有了。

REG_OPTION_NON_VOLATILE:写入到注册表文件中。

 

//写入注册表为DWORD类型

//返回ERROR_SUCCESS(0)标识成功
DWORD SetRegValue(HKEY hMainKey, LPCTSTR lpSubKey, LPCTSTR lpKeyName, DWORD dwKeyValue)
{
	HKEY hKey;
	DWORD dwDispoistion = REG_OPENED_EXISTING_KEY;
	DWORD dwRet = ERROR_SUCCESS;

	dwRet = ::RegCreateKeyEx(hMainKey, lpSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDispoistion);
	if (ERROR_SUCCESS == dwRet)
	{
		dwRet = ::RegSetValueEx(hKey, lpKeyName, 0, REG_DWORD, (BYTE*)&dwKeyValue, sizeof(DWORD));
	}

	::RegCloseKey(hKey);

	return dwRet;
}

//写入注册表为LPCTSTR类型

DWORD SetRegValue(HKEY hMainKey, LPCTSTR lpSubKey, LPCTSTR lpKeyName, LPCTSTR lpKeyValue)
{
	HKEY hKey;
	DWORD dwDisposition = REG_OPENED_EXISTING_KEY;
	DWORD dwRet = ERROR_SUCCESS;

	dwRet = ::RegCreateKeyEx(hMainKey, lpSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisposition);
	if (ERROR_SUCCESS == dwRet)
	{
		dwRet = ::RegSetValueEx(hKey, lpKeyName, 0, REG_SZ, (BYTE*)lpKeyValue, _tcslen(lpKeyValue) * sizeof(TCHAR));
	}

	::RegCloseKey(hKey);

	return dwRet;
}

// 读注册表的值

DWORD GetRegValue(HKEY hMainKey, LPCTSTR lpSubKey, LPCTSTR lpKeyName, wstring& wstrKeyValueRet)
{
	HKEY hKey;
	DWORD dwRet = ERROR_SUCCESS;

	dwRet == ::RegOpenKeyEx(hMainKey, lpSubKey, 0, KEY_READ, &hKey);
	if (ERROR_SUCCESS == dwRet)
	{
		DWORD dwType = REG_SZ;
		DWORD dwSize = MAX_PATH;
		TCHAR szReturnValue[MAX_PATH + 1] = { 0 };
		dwRet == ::RegQueryValueEx(hKey, lpKeyName, NULL, &dwType, (LPBYTE)szReturnValue, &dwSize);
		if (ERROR_SUCCESS == dwRet)
		{
			wstrKeyValueRet = szReturnValue;
		}
	}

	::RegCloseKey(hKey);

	return dwRet;
}

// 删注册表的值

DWORD DelRegKey(HKEY hMainKey, LPCTSTR lpSubKey, LPCTSTR lpKeyName)
{
	HKEY hKEY;
	DWORD dwRet = ERROR_SUCCESS;
	
	dwRet = ::RegOpenKeyEx(hMainKey, lpSubKey, 0, KEY_SET_VALUE, &hKEY);
	if (ERROR_SUCCESS == dwRet)
	{
		dwRet = ::RegDeleteKey(hKEY, lpKeyName);
	}

	::RegCloseKey(hKEY);

	return dwRet;
}

 

注册表重定向问题解决办法:

32位程序如何访问64位的注册表(HKLM/Software)

在调用函数RegCreateKeyEx创建注册表项时,对其第六个参数REGSAM  samDesired设置中添加参数KEY_WOW64_64KEY,这样可以实现对64位注册表的访问;

在调用函数RegOpenKeyEx打开注册表项时,要对其第四个参数REGSAM  samDesired设置中添加参数KEY_WOW64_64KEY,这样可以实现对64位注册表的访问;

 

64位程序如何访问32位的注册表(HKLM/Software/Wow6432Node

在调用函数RegCreateKeyEx创建注册表项时,对其第六个参数REGSAM  samDesired设置中添加参数KEY_WOW32_64KEY,这样可以实现对32位注册表的访问;

在调用函数RegOpenKeyEx打开注册表项时,要对其第四个参数REGSAM  samDesired设置中添加参数KEY_WOW32_64KEY,这样可以实现对32位注册表的访问;

32位程序默认访问32位注册表信息,64位程序默认访问64位注册表信息;
 

你可能感兴趣的:(【Windows】系统开发)