?? myreg.cpp
字號:
//CReg類定義文件
/********************************************************************************
//解析INI文件
// Written by: YiJian Feng
// Email: netfyee@hotmail.com
// Last Edit: 2003-5-5
---使用
首先必須設置
BOOL SetFileName(CString FileName);
BOOL SetSectionName(CString SectionName);
**********************************************************************************/
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MyReg.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CReg::CReg()
{
m_hRegKey = (HKEY)0;
SetMyRegRootKey();
m_strSubKey = NULL;
m_strErrorDec = new TCHAR[MAX_PATH];
}
CReg::~CReg()
{
CloseMyReg();
delete m_strErrorDec;
}
//////////////////////////////////////////////////////////////////////
// Member Function
//////////////////////////////////////////////////////////////////////
long CReg::CreateMyReg(LPCTSTR lpSubKey, BOOL IsOnlyRead)
{
long eRegErr;
CloseMyReg();
eRegErr = SetMyRegSubKeyString(lpSubKey);
if (REG_NO_ERROR != eRegErr)
return eRegErr;
//打開注冊表的狀態
if (!IsOnlyRead)
{
DWORD dwDisposition;
if(ERROR_SUCCESS != RegCreateKeyEx(m_hRegRootKey,
m_strSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&m_hRegKey,
&dwDisposition))
eRegErr = REG_BAD_CREATE;
}
else
{
if (ERROR_SUCCESS != RegOpenKeyEx(m_hRegRootKey,
m_strSubKey,
0,
KEY_ALL_ACCESS,
&m_hRegKey))
eRegErr = REG_BAD_CREATE;
}
return eRegErr;
}
long CReg::CloseMyReg()
{
long eRegErr = REG_NO_ERROR;
//關閉注冊表句柄
if ((HKEY)0 < m_hRegKey)
{
if (ERROR_SUCCESS != RegCloseKey(m_hRegKey))
eRegErr = REG_BAD_CLOSE;
m_hRegKey = (HKEY)0;
}
//釋放子鍵字符串緩存
if (NULL != m_strSubKey)
{
delete [] m_strSubKey;
m_strSubKey = NULL;
}
return eRegErr;
}
void CReg::SetMyRegRootKey(HKEY lpRootKey)
{
m_hRegRootKey = lpRootKey;
}
long CReg::SetMyRegSubKeyString(LPCTSTR lpSubKey)
{
if (m_strSubKey)
delete [] m_strSubKey;
int nSubKeySize = lstrlen(lpSubKey);
if (0 == nSubKeySize)
return REG_INVALID_SUBKEY;
//判斷第一個字符是否為"\",因為子鍵第一個字符不能為反斜杠
LPCTSTR lpNextPoint = "";
if (__TEXT('\\') == *lpSubKey)
{
lpNextPoint = CharNext(lpSubKey);
--nSubKeySize;
}
else
lpNextPoint = lpSubKey;
m_strSubKey = new TCHAR[nSubKeySize + 1]; //lstrlen求得的長
//度不包括終止符“NULL”
lstrcpy(m_strSubKey, lpSubKey);
return REG_NO_ERROR;
}
long CReg::GetMyRegValueAttribute(LPCTSTR lpValueName,
LPDWORD lpType,
LPDWORD lpcbData)
{
if ((HKEY)0 == m_hRegKey)
return REG_NOT_INITIALIZE;
if (ERROR_SUCCESS != RegQueryValueEx(m_hRegKey,
lpValueName,
NULL,
lpType,
NULL,
lpcbData))
return REG_FAIL_READATTRIBUTE;
return REG_NO_ERROR;
}
long CReg::GetMyRegValueAttribute(LPCTSTR lpSubKeyName,
LPCTSTR lpValueName,
LPDWORD lpType,
LPDWORD lpcbData)
{
long eRegErr = CreateMyReg(lpSubKeyName, TRUE);
if (REG_NO_ERROR != eRegErr)
return eRegErr;
eRegErr = GetMyRegValueAttribute(lpValueName, lpType, lpcbData);
return eRegErr;
}
long CReg::GetMyRegValue(LPCTSTR lpValueName, LPBYTE lpData)
{
long eRegErr = GetMyRegValueEx(lpValueName, REG_NONE, lpData);
return eRegErr;
}
long CReg::GetMyRegValue(LPCTSTR lpSubKeyName,
LPCTSTR lpValueName,
LPBYTE lpData)
{
long eRegErr = GetMyRegValueEx(lpSubKeyName,
lpValueName,
REG_NONE,
lpData);
return eRegErr;
}
long CReg::GetMyRegValue(LPCTSTR lpValueName,
LPTSTR lpData,
LPCTSTR lpDefData)
{
DWORD dwDataLength = MAX_PATH;
if (ERROR_SUCCESS != RegQueryValueEx(m_hRegKey,
lpValueName,
NULL,
NULL,
reinterpret_cast<BYTE*>(lpData),
&dwDataLength))
{
lstrcpy(lpData, lpDefData);
}
return 0;
};
long CReg::SetMyRegValue(LPCTSTR lpValueName,
LPCTSTR lpData)
{
if (ERROR_SUCCESS != RegSetValueEx(m_hRegKey,
lpValueName,
NULL,
REG_SZ,
reinterpret_cast<const BYTE*>(lpData),
lstrlen(lpData)))
{
return REG_FAIL_WRITEKEYVALUE;
}
return REG_NO_ERROR;
}
long CReg::GetMyRegValue(LPCTSTR lpSubKeyName,
LPCTSTR lpValueName,
LPTSTR lpData)
{
long eRegErr = GetMyRegValueEx(lpSubKeyName,
lpValueName,
REG_SZ,
reinterpret_cast<LPBYTE>(lpData));
return eRegErr;
}
long CReg::GetMyRegValue(LPCTSTR lpValueName,
LPDWORD lpData,
const DWORD dwDefData)
{
DWORD dwDataLength = MAX_PATH;
if (ERROR_SUCCESS != RegQueryValueEx(m_hRegKey,
lpValueName,
NULL,
NULL,
reinterpret_cast<BYTE*>(lpData),
&dwDataLength))
{
*lpData = dwDefData;
}
return 0;
}
long CReg::SetMyRegValue(LPCTSTR lpValueName,
const DWORD lData)
{
int nData[256];
nData[0] = lData;
if (ERROR_SUCCESS != RegSetValueEx(m_hRegKey,
lpValueName,
NULL,
REG_DWORD,
(const unsigned char *)nData,
4))
{
return REG_FAIL_WRITEKEYVALUE;
}
return REG_NO_ERROR;
}
long CReg::GetMyRegValue(LPCTSTR lpSubKeyName,
LPCTSTR lpValueName,
LPDWORD lpData)
{
long eRegErr = GetMyRegValueEx(lpSubKeyName,
lpValueName,
REG_DWORD,
reinterpret_cast<LPBYTE>(lpData));
return eRegErr;
}
long CReg::GetMyRegValueEx(LPCTSTR lpValueName,
const DWORD cbType,
LPBYTE lpData)
{
DWORD dType;
DWORD dcbData;
long eRegErr = GetMyRegValueAttribute(lpValueName, &dType, &dcbData);
if (REG_NO_ERROR != eRegErr)
return eRegErr;
if ((REG_NONE != cbType) && (cbType != dType))
return REG_ERROR_KEYTYPE;
++dcbData;
if (ERROR_SUCCESS != RegQueryValueEx(m_hRegKey,
lpValueName,
NULL,
NULL,
lpData,
&dcbData))
{
return REG_FAIL_READKEYVALUE;
}
return REG_NO_ERROR;
}
long CReg::GetMyRegValueEx(LPCTSTR lpSubKeyName,
LPCTSTR lpValueName,
const DWORD cdType,
LPBYTE lpData)
{
long eRegErr = CreateMyReg(lpSubKeyName, TRUE);
if (REG_NO_ERROR != eRegErr)
return eRegErr;
eRegErr = GetMyRegValueEx(lpValueName, cdType, lpData);
return REG_NO_ERROR;
}
long CReg::DelMyRegValue(LPCTSTR lpValueName)
{
if (ERROR_SUCCESS != RegDeleteValue(m_hRegKey,
lpValueName))
{
return REG_FAIL_DELKEYVALUE;
}
return REG_NO_ERROR;
}
long CReg::DelMyRegValue(LPCTSTR lpSubKeyName, LPCTSTR lpValueName)
{
long eRegErr = CreateMyReg(lpSubKeyName, TRUE);
if (REG_NO_ERROR != eRegErr)
return eRegErr;
eRegErr = DelMyRegValue(lpValueName);
return REG_NO_ERROR;
}
long CReg::DelMyRegSubKey(LPCTSTR lpDelSubKeyName)
{
if (ERROR_SUCCESS != RegDeleteKey(m_hRegKey, lpDelSubKeyName))
{
return REG_FAIL_DELSUBKEY;
}
return REG_NO_ERROR;
}
long CReg::DelMyRegSubKey(LPCTSTR lpSubKeyName, LPCTSTR lpDelSubKeyName)
{
long eRegErr = CreateMyReg(lpSubKeyName, TRUE);
if (REG_NO_ERROR != eRegErr)
return eRegErr;
eRegErr = DelMyRegSubKey(lpDelSubKeyName);
return REG_NO_ERROR;
}
long CReg::GetMyRegSubKeysCount(LPDWORD lpcbSubKeys, LPDWORD lpSubValue)
{
if (ERROR_SUCCESS != RegQueryInfoKey(m_hRegKey,
NULL,
NULL,
NULL,
lpcbSubKeys,
NULL,
NULL,
lpSubValue,
NULL,
NULL,
NULL,
NULL))
{
return REG_FAIL_DELSUBKEY;
}
return REG_NO_ERROR;
}
long CReg::GetMyRegSubKeysCount(LPCTSTR lpSubKeyName, LPDWORD lpcbSubKeys, LPDWORD lpSubValue)
{
long eRegErr = CreateMyReg(lpSubKeyName, TRUE);
if (REG_NO_ERROR != eRegErr)
return eRegErr;
eRegErr = GetMyRegSubKeysCount(lpcbSubKeys, lpSubValue);
return REG_NO_ERROR;
}
long CReg::EnumMyRegSubKeys(DWORD dwIndex, LPTSTR lpName)
{
DWORD dwcbName = MAX_PATH;
long eRegErr = RegEnumKeyEx(m_hRegKey, dwIndex, lpName, &dwcbName,
NULL, NULL, NULL, NULL);
if (ERROR_NO_MORE_ITEMS == eRegErr)
return REG_NO_MORE_ITEMS;
else if (ERROR_SUCCESS != eRegErr)
return RET_FAIL_ENUM_SUBKEY;
return REG_NO_ERROR;
}
LPCTSTR CReg::GetMyRegErrMsg(const long lErrorIndex) const
{
switch (lErrorIndex)
{
case REG_NO_ERROR:
lstrcpy(m_strErrorDec, _T("沒有錯誤!"));
break;
case REG_BAD_CREATE:
lstrcpy(m_strErrorDec, _T("打開注冊表錯誤!"));
break;
case REG_NOT_INITIALIZE:
lstrcpy(m_strErrorDec, _T("沒有初始化!"));
break;
case REG_BAD_CLOSE:
lstrcpy(m_strErrorDec, _T("關閉注冊表錯誤!"));
break;
case REG_INVALID_SUBKEY:
lstrcpy(m_strErrorDec, _T("無效的子鍵!"));
break;
case REG_FAIL_READATTRIBUTE:
lstrcpy(m_strErrorDec, _T("讀取鍵值屬性失敗!"));
break;
case REG_FAIL_READKEYVALUE:
lstrcpy(m_strErrorDec, _T("讀取鍵值失?。?quot;));
break;
case REG_ERROR_KEYTYPE:
lstrcpy(m_strErrorDec, _T("錯誤的鍵類型"));
break;
case REG_BAD_ALLOC:
lstrcpy(m_strErrorDec, _T("分配內存失??!"));
break;
case REG_NO_ENOUGH_BUFFER:
lstrcpy(m_strErrorDec, _T("給定的緩存太小!"));
break;
case REG_FAIL_WRITEKEYVALUE:
lstrcpy(m_strErrorDec, _T("寫入鍵值失敗!"));
break;
case REG_FAIL_DELKEYVALUE:
lstrcpy(m_strErrorDec, _T("刪除鍵值失敗!"));
break;
case REG_FAIL_DELSUBKEY:
lstrcpy(m_strErrorDec, _T("刪除子鍵失敗!"));
break;
case RET_FAIL_ENUM_SUBKEY:
lstrcpy(m_strErrorDec, _T("列舉子鍵失敗!"));
break;
case REG_NO_MORE_ITEMS:
lstrcpy(m_strErrorDec, _T("列舉子鍵結束!"));
break;
default:
lstrcpy(m_strErrorDec, _T("未知的錯誤類型!"));
break;
}
return m_strErrorDec;
}
long CReg::EnumMyRegSubKeyValues(DWORD dwIndex, LPTSTR lpName, LPTSTR lpValue)
{
DWORD dwcbName = MAX_PATH;
DWORD type_1=REG_SZ;
DWORD cbData_1=20;
long eRegErr = ::RegEnumValue(m_hRegKey, dwIndex, lpName, &dwcbName , NULL, &type_1,(BYTE*)lpValue,&cbData_1);
if (ERROR_NO_MORE_ITEMS == eRegErr)
return REG_NO_MORE_ITEMS;
else if (ERROR_SUCCESS != eRegErr)
return RET_FAIL_ENUM_SUBKEY;
return REG_NO_ERROR;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -