VC注册表操作

时间:2022-09-04 21:33:17

注册表是什么

注册表是WINDOWS的大管家,系统的设置、记录、程序关联都在里面。他其实就是一个数据库,在系统中处于核心地位,在后台管理WINDOWS。


注册表怎样打开

开始--运行中输入regedit就可以了

VC注册表操作


VC注册表操作


注册表操作

CRegConfig

头文件
// RegConfig.h: interface for the CRegConfig class.
// Written by Alexander Hritonenkov on march 19, 2003
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_REGCONFIG_H__7E051819_5CAA_4E49_99F2_0236B42086A4__INCLUDED_)
#define AFX_REGCONFIG_H__7E051819_5CAA_4E49_99F2_0236B42086A4__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "atlbase.h"

class CRegConfig  
{
public:
	void SetRegKey(HKEY hKey, LPCTSTR strKey);	// Sets registry key to keep settings in
	void Load();	// Loads settings from registry
	void Save();	// Saves settings to registry
	CRegConfig(HKEY hKey, LPCTSTR strKey);	// Constructor that sets registry key to keep settings in
	CRegConfig();	// Default constructor
	virtual ~CRegConfig();	// Destructor (empty)

protected:
	HKEY m_hKey;	// Parent key descriptor
	CString m_strKey;	// Our key full name
	CRegKey m_rKey;
	virtual void TransferAllData(BOOL bSave)=0;	// Data transfering function
	void Transfer(BOOL bSave, LPCTSTR strValueName, CString &strValue);	// Function to load/save string data
	void Transfer(BOOL bSave, LPCTSTR strValueName, DWORD &dwValue);	// Function to load/save DWORD data
	void Transfer(BOOL bSave, LPCTSTR strValueName, CByteArray &bValue);	// Function to load/save binary data
};

#endif // !defined(AFX_REGCONFIG_H__7E051819_5CAA_4E49_99F2_0236B42086A4__INCLUDED_)

源文件
// RegConfig.cpp: implementation of the CRegConfig class.
// Written by Alexander Hritonenkov on march 19, 2003
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "config.h"
#include "RegConfig.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CRegConfig::CRegConfig(HKEY hKey, LPCTSTR strKey)
{
	SetRegKey(hKey, strKey);
}

CRegConfig::CRegConfig()
{
	m_hKey=NULL;
	m_strKey="";
}

CRegConfig::~CRegConfig()
{
}

void CRegConfig::SetRegKey(HKEY hKey, LPCTSTR strKey)
{
	m_hKey=hKey;
	m_strKey=strKey;
}

void CRegConfig::Save()
{
	if(m_rKey.Create(m_hKey, m_strKey)==ERROR_SUCCESS)
	{
		TransferAllData(TRUE);
		m_rKey.Close();
	}
}

void CRegConfig::Load()
{
	if(m_rKey.Create(m_hKey, m_strKey)==ERROR_SUCCESS)
	{
		TransferAllData(FALSE);
		m_rKey.Close();
	}
}

void CRegConfig::Transfer(BOOL bSave, LPCTSTR strValueName, DWORD &dwValue)
{
	if(bSave)
		m_rKey.SetValue(dwValue, strValueName);
	else
		m_rKey.QueryValue(dwValue, strValueName);
}

void CRegConfig::Transfer(BOOL bSave, LPCTSTR strValueName, CString &strValue)
{
	if(bSave)
		m_rKey.SetValue(strValue, strValueName);
	else
	{
		DWORD dwLen;
		LPTSTR lpStr;
		if(m_rKey.QueryValue(NULL, strValueName, &dwLen)==ERROR_SUCCESS)
		{
			lpStr=strValue.GetBuffer(dwLen+1);
			m_rKey.QueryValue(lpStr, strValueName, &dwLen);
			strValue.ReleaseBuffer(dwLen);
		}
	}
}

void CRegConfig::Transfer(BOOL bSave, LPCTSTR strValueName, CByteArray &bValue)
{
	DWORD dwLen, dwType;
	LPBYTE lpData;
	if(bSave)
	{
		dwLen=bValue.GetSize();
		lpData=bValue.GetData();
		RegSetValueEx(m_rKey.m_hKey, strValueName, 0, REG_BINARY, lpData, dwLen);
	}
	else
	{
		dwType=REG_BINARY;
		if(RegQueryValueEx(m_rKey.m_hKey, strValueName, NULL, &dwType, NULL, &dwLen)==ERROR_SUCCESS)
		{
			bValue.RemoveAll();
			bValue.SetSize(dwLen);
			lpData=bValue.GetData();
			RegQueryValueEx(m_rKey.m_hKey, strValueName, NULL, &dwType, lpData, &dwLen);
		}
	}
}

CMyRegConfig

头文件
// MyRegConfig.h: interface for the CMyRegConfig class.
// Written by Alexander Hritonenkov on march 19, 2003
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MYREGCONFIG_H__9F26EC5C_AE0B_4259_A4B4_A09A40FB89D7__INCLUDED_)
#define AFX_MYREGCONFIG_H__9F26EC5C_AE0B_4259_A4B4_A09A40FB89D7__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "RegConfig.h"

class CMyRegConfig : public CRegConfig  
{
public:
	CMyRegConfig();
	virtual ~CMyRegConfig();

	// data members
	DWORD m_dwValue1;
	DWORD m_dwValue2;
	CString m_strValue;
	CByteArray m_bData;

protected:
	virtual void TransferAllData(BOOL bSave);	// overrided pure virtual function for perform saving and loading data
};

#endif // !defined(AFX_MYREGCONFIG_H__9F26EC5C_AE0B_4259_A4B4_A09A40FB89D7__INCLUDED_)

源文件
// MyRegConfig.cpp: implementation of the CMyRegConfig class.
// Written by Alexander Hritonenkov on march 19, 2003
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "config.h"
#include "MyRegConfig.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMyRegConfig::CMyRegConfig() : CRegConfig(HKEY_LOCAL_MACHINE, "Software\\test")
{
	// set default values for our settings
	// they are used on first start (if data is not present in registry)
	m_dwValue1=100;
	m_dwValue2=200;
	m_strValue="Sample string";

	Load();	// you can add automatic load of config on construction
}

CMyRegConfig::~CMyRegConfig()
{
	Save();	// you can add automatic save of config on destruction
}

void CMyRegConfig::TransferAllData(BOOL bSave)
{
	// add Transfer() function for each data member in your class
	Transfer(bSave, "Value1", m_dwValue1);
	Transfer(bSave, "Value2", m_dwValue2);
	Transfer(bSave, "String", m_strValue);
	Transfer(bSave, "Data", m_bData);
}

操作界面

VC注册表操作

相关操作
void CConfigDlg::OnBtnOk() 
{
	SaveData();
	OnOK();
}

void CConfigDlg::LoadData()
{
	SetDlgItemInt(ID_VAL1, m_Config.m_dwValue1, 0);
	SetDlgItemInt(ID_VAL2, m_Config.m_dwValue2, 0);
	SetDlgItemText(ID_STRING, m_Config.m_strValue);
	LPCTSTR lpStr=(LPCTSTR)m_Config.m_bData.GetData();
	if(lpStr!=NULL)
	{
		SetDlgItemText(ID_BINARY, lpStr);
	}
}

void CConfigDlg::SaveData()
{
	m_Config.m_dwValue1=GetDlgItemInt(ID_VAL1, NULL, 0);
	m_Config.m_dwValue2=GetDlgItemInt(ID_VAL2, NULL, 0);
	GetDlgItemText(ID_STRING, m_Config.m_strValue);
	CString str;
	GetDlgItemText(ID_BINARY, str);
	m_Config.m_bData.RemoveAll();
	m_Config.m_bData.SetSize(str.GetLength()+1);
	memcpy(m_Config.m_bData.GetData(), (LPCTSTR)str, str.GetLength());
}

运行效果

根据如下所知,是要在HKEY_LOCAL_MACHINE项的Software下添加一项test
VC注册表操作


运行前,注册表中没有这一项
VC注册表操作


运行后,我们发现多了一个我们生成的这个项
VC注册表操作 

注册表中多了一项test
VC注册表操作  VC注册表操作

修改值
VC注册表操作  VC注册表操作