天天看點

VC++ 系統資料庫操作

頭檔案聲明(CRegKey.h):

#ifndef REG_KEY_HEAD_FILE
#define REG_KEY_HEAD_FILE

#pragma once

//鍵項組手
class CRegKey
{
	//鍵項變量
protected:
	HKEY							m_hRegKey;							//目前鍵項

	//靜态變量
protected:
	static TCHAR					m_szMainKeyName[64];				//主鍵名字

	//函數定義
public:
	//構造函數
	CWHRegKey();
	//析構函數
	virtual ~CWHRegKey();

	//配置函數
public:
	//設定主鍵
	static VOID SetMainKeyName(LPCTSTR pszMainKeyName);
	//擷取主鍵
	static LPCTSTR GetMainKeyName() { return m_szMainKeyName; }

	//綁定函數
public:
	//解除綁定
	HKEY Detach();
	//綁定鍵項
	HKEY Attach(HKEY hRegKey);

	//管理函數
public:
	//關閉鍵項
	bool CloseRegKey();
	//打開鍵項
	bool OpenRegKey(LPCTSTR pszKeyName, bool bCreate);
	//打開鍵項
	bool OpenRegKey(LPCTSTR pszMainKeyName, LPCTSTR pszKeyName, bool bCreate);

	//控制函數
public:
	//打開鍵項
	HKEY OpenItemKey(LPCTSTR pszSubKeyName);
	//建立鍵項
	HKEY CreateItemKey(LPCTSTR pszSubKeyName);
	//枚舉鍵項
	bool EnumItemString(DWORD dwIndex, LPTSTR pszString, DWORD dwSize);

	//寫入函數
public:
	//寫入數值
	bool WriteValue(LPCTSTR pszName, DWORD dwValue);
	//寫入字元
	bool WriteString(LPCTSTR pszName, LPCTSTR pszString);
	//寫入字元
	bool WriteEncryptString(LPCTSTR pszName, LPCTSTR pszString);
	//寫入資料
	bool WriteBinary(LPCTSTR pszName, const VOID * pData, DWORD dwSize);

	//讀取函數
public:
	//讀取數值
	DWORD GetValue(LPCTSTR pszName, DWORD dwDefValue);
	//讀取資料
	DWORD GetBinary(LPCTSTR pszName, VOID * pData, DWORD dwBufferSize);
	//讀取字元
	DWORD GetString(LPCTSTR pszName, LPTSTR pszString, UINT uMaxCount);
	//讀取字元
	DWORD GetEncryptString(LPCTSTR pszName, LPTSTR pszString, UINT uMaxCount);

	//删除函數
public:
	//删除數值
	bool DeleteValue(LPCTSTR pszName);
	//删除鍵項
	bool DeleteKey(LPCTSTR pszSubKeyName);

	//輔助函數
public:
	//鍵項重載
	operator HKEY() { return m_hRegKey; }
	//擷取鍵項
	HKEY GetRegKey() { return m_hRegKey; }

	//内部函數
private:
	//删除鍵項
	LONG DeleteKey(HKEY hParentKey, LPCTSTR pszSubKeyName);
};

#endif
           

源碼實作(CRegKey.cpp):

#include "StdAfx.h"
#include "CRegKey.h"
#include "CEncrypt.h"

//靜态變量

TCHAR		CRegKey::m_szMainKeyName[64]=TEXT("");					//主鍵名字

//構造函數
CRegKey::CRegKey()
{
	//鍵項變量
	m_hRegKey=NULL;

	//鍵名變量
	if (m_szMainKeyName[0]==0)
	{
		CWinApp * pWinApp=AfxGetApp();
		lstrcpyn(m_szMainKeyName,pWinApp->m_pszAppName,CountArray(m_szMainKeyName));
	}

	return;
}

//析構函數
CRegKey::~CRegKey()
{
	//關閉鍵項
	if (m_hRegKey!=NULL) CloseRegKey();

	return;
}

//設定主鍵
VOID CRegKey::SetMainKeyName(LPCTSTR pszMainKeyName)
{
	//設定變量
	ASSERT(pszMainKeyName!=NULL);
	lstrcpyn(m_szMainKeyName,pszMainKeyName,CountArray(m_szMainKeyName));

	return;
}

//接觸綁定
HKEY CRegKey::Detach()
{
	//儲存變量
	HKEY hRegKey=m_hRegKey;

	//設定變量
	m_hRegKey=NULL;

	return hRegKey;
}

//綁定鍵項
HKEY CRegKey::Attach(HKEY hRegKey)
{
	//效驗參數
	ASSERT(hRegKey!=NULL);

	//設定變量
	m_hRegKey=hRegKey;

	return m_hRegKey;
}

//關閉鍵項
bool CRegKey::CloseRegKey()
{
	//關閉鍵項
	RegCloseKey(m_hRegKey);

	//設定變量
	m_hRegKey=NULL;

	return true;
}

//打開鍵項
bool CRegKey::OpenRegKey(LPCTSTR pszKeyName, bool bCreate)
{
	//效驗參數
	ASSERT(pszKeyName!=NULL);

	//關閉鍵項
	if (m_hRegKey!=NULL) RegCloseKey(m_hRegKey);

	//生成鍵名
	TCHAR szFullKeyName[256]=TEXT("");
	_sntprintf(szFullKeyName,CountArray(szFullKeyName),TEXT("Software\\%s\\%s\\%s"),szProductKey,m_szMainKeyName,pszKeyName);

	//打開鍵項
	m_hRegKey=NULL;
	LONG lResult=RegOpenKey(HKEY_CURRENT_USER,szFullKeyName,&m_hRegKey);
	if ((lResult!=ERROR_SUCCESS)&&(bCreate==true)) lResult=RegCreateKey(HKEY_CURRENT_USER,szFullKeyName,&m_hRegKey);

	return (lResult==ERROR_SUCCESS);
}

//打開鍵項
bool CRegKey::OpenRegKey(LPCTSTR pszMainKeyName, LPCTSTR pszKeyName, bool bCreate)
{
	//效驗參數
	ASSERT(pszKeyName!=NULL);
	ASSERT(pszMainKeyName!=NULL);

	//關閉鍵項
	if (m_hRegKey!=NULL) RegCloseKey(m_hRegKey);

	//生成鍵名
	TCHAR szFullKeyName[256]=TEXT("");
	_sntprintf(szFullKeyName,CountArray(szFullKeyName),TEXT("Software\\%s\\%s\\%s"),szProductKey,pszMainKeyName,pszKeyName);

	//打開鍵項
	m_hRegKey=NULL;
	LONG lResult=RegOpenKey(HKEY_CURRENT_USER,szFullKeyName,&m_hRegKey);
	if ((lResult!=ERROR_SUCCESS)&&(bCreate==true)) lResult=RegCreateKey(HKEY_CURRENT_USER,szFullKeyName,&m_hRegKey);

	return (lResult==ERROR_SUCCESS);
}

//打開鍵項
HKEY CRegKey::OpenItemKey(LPCTSTR pszSubKeyName)
{
	//效驗參數
	ASSERT(m_hRegKey!=NULL);
	ASSERT(pszSubKeyName!=NULL);

	//打開鍵項
	HKEY hRegKey=NULL;
	RegOpenKey(m_hRegKey,pszSubKeyName,&hRegKey);

	return hRegKey;
}

//建立鍵項
HKEY CRegKey::CreateItemKey(LPCTSTR pszSubKeyName)
{
	//效驗參數
	ASSERT(m_hRegKey!=NULL);
	ASSERT(pszSubKeyName!=NULL);

	//建立鍵項
	HKEY hRegKey=NULL;
	RegCreateKey(m_hRegKey,pszSubKeyName,&hRegKey);

	return hRegKey;
}

//枚舉鍵項
bool CRegKey::EnumItemString(DWORD dwIndex, LPTSTR pszString, DWORD dwSize)
{
	//效驗參數
	ASSERT(m_hRegKey!=NULL);

	//設定變量
	pszString[0]=0;

	//枚舉鍵項
	LONG lResult=RegEnumKey(m_hRegKey,dwIndex,pszString,dwSize);

	return (lResult==ERROR_SUCCESS);
}

//寫入數值
bool CRegKey::WriteValue(LPCTSTR pszName, DWORD dwValue)
{
	//效驗參數
	ASSERT(m_hRegKey!=NULL);

	//寫入數值
	LONG lResult=RegSetValueEx(m_hRegKey,pszName,0,REG_DWORD,(LPBYTE)(&dwValue),sizeof(DWORD));

	return (lResult==ERROR_SUCCESS);
}

//寫入字元
bool CRegKey::WriteString(LPCTSTR pszName, LPCTSTR pszString)
{
	//效驗參數
	ASSERT(m_hRegKey!=NULL);

	//寫入數值
	DWORD dwDataSize=CountStringBuffer(pszString);
	LONG lResult=RegSetValueEx(m_hRegKey,pszName,0,REG_SZ,(LPBYTE)pszString,dwDataSize);

	return (lResult==ERROR_SUCCESS);
}

//寫入字元
bool CRegKey::WriteEncryptString(LPCTSTR pszName, LPCTSTR pszString)
{
	//加密資料
	TCHAR szRegString[MAX_ENCRYPT_LEN+1]=TEXT("");
	CEncrypt::XorEncrypt(pszString,szRegString,CountArray(szRegString));

	//寫入字元
	return WriteString(pszName,szRegString);
}

//寫入資料
bool CRegKey::WriteBinary(LPCTSTR pszName, const VOID * pData, DWORD dwSize)
{
	//效驗參數
	ASSERT(m_hRegKey!=NULL);

	//寫入數值
	LONG lResult=RegSetValueEx(m_hRegKey,pszName,0,REG_BINARY,(LPBYTE)(pData),dwSize);

	return (lResult==ERROR_SUCCESS);
}

//讀取數值
DWORD CRegKey::GetValue(LPCTSTR pszName, DWORD dwDefValue)
{
	//效驗參數
	ASSERT(m_hRegKey!=NULL);

	//讀取數值
	DWORD dwType=REG_NONE,dwResultSize=sizeof(DWORD),dwValue=0;
	LONG lResult=RegQueryValueEx(m_hRegKey,pszName,0,&dwType,(BYTE *)(&dwValue),&dwResultSize);
	if ((lResult!=ERROR_SUCCESS)||(dwType!=REG_DWORD)) return dwDefValue;

	return dwValue;
}

//讀取資料
DWORD CRegKey::GetBinary(LPCTSTR pszName, VOID * pData, DWORD dwBufferSize)
{
	//效驗參數
	ASSERT(pData!=NULL);
	ASSERT(m_hRegKey!=NULL);

	//讀取數值
	DWORD dwType=REG_NONE,dwResultSize=dwBufferSize;
	LONG lResult=RegQueryValueEx(m_hRegKey,pszName,0,&dwType,(BYTE *)(pData),&dwResultSize);
	if ((lResult!=ERROR_SUCCESS)||(dwType!=REG_BINARY)) return 0;

	return dwResultSize;
}

//讀取字元
DWORD CRegKey::GetString(LPCTSTR pszName, LPTSTR pszString, UINT uMaxCount)
{
	//效驗參數
	ASSERT(pszString!=NULL);
	ASSERT(m_hRegKey!=NULL);

	//讀取數值
	DWORD dwType=REG_NONE,dwResultSize=uMaxCount*sizeof(TCHAR);
	LONG lResult=RegQueryValueEx(m_hRegKey,pszName,0,&dwType,(BYTE *)(pszString),&dwResultSize);
	if ((lResult!=ERROR_SUCCESS)||(dwType!=REG_SZ)) return 0;

	return dwResultSize/sizeof(TCHAR);
}

//讀取字元
DWORD CRegKey::GetEncryptString(LPCTSTR pszName, LPTSTR pszString, UINT uMaxCount)
{
	//效驗參數
	ASSERT(pszString!=NULL);
	ASSERT(m_hRegKey!=NULL);

	//讀取字元
	TCHAR szRegString[MAX_ENCRYPT_LEN+1]=TEXT("");
	GetString(pszName,szRegString,CountArray(szRegString));

	//解密資料
	CEncrypt::XorDecrypt(szRegString,pszString,uMaxCount);

	return lstrlen(pszString);
}

//删除數值
bool CRegKey::DeleteValue(LPCTSTR pszName)
{
	//效驗參數
	ASSERT(m_hRegKey!=NULL);

	//删除數值
	LONG lResult=RegDeleteValue(m_hRegKey,pszName);

	return (lResult==ERROR_SUCCESS);
}

//删除鍵項
bool CRegKey::DeleteKey(LPCTSTR pszSubKeyName)
{
	//效驗參數
	ASSERT(m_hRegKey!=NULL);
	ASSERT(pszSubKeyName!=NULL);

	//删除鍵項
	LONG lResult=RecurseDeleteKey(m_hRegKey,pszSubKeyName);

	return (lResult==ERROR_SUCCESS);
}

//删除鍵項
LONG CRegKey::DeleteKey(HKEY hParentKey, LPCTSTR pszSubKeyName)
{
	//效驗參數
	ASSERT(hParentKey!=NULL);
	ASSERT(pszSubKeyName!=NULL);

	//打開鍵項
	HKEY hSubKey=NULL;
	LONG lResult=RegOpenKey(hParentKey,pszSubKeyName,&hSubKey);
	if (lResult!=ERROR_SUCCESS) return lResult;

	//遞歸删除
	TCHAR szKeyName[256];
	while (RegEnumKey(hSubKey,0,szKeyName,sizeof(szKeyName))==ERROR_SUCCESS)
	{
		//删除鍵項
		lResult=RecurseDeleteKey(hSubKey,szKeyName);
		if (lResult!=ERROR_SUCCESS)
		{
			RegCloseKey(hSubKey);
			return lResult;
		}
	}

	//關閉鍵項
	RegCloseKey(hSubKey);

	//删除鍵項
	lResult=RegDeleteKey(hParentKey,pszSubKeyName);

	return lResult;
}