頭檔案聲明(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;
}