www.pudn.com > fbt-a3-20041206.zip > reg.cpp, change:2004-03-06,size:7788b


// Copyright (c) 2004, Antony C. Roberts 
 
// Use of this file is subject to the terms 
// described in the LICENSE.TXT file that 
// accompanies this file. 
// 
// Your use of this file indicates your 
// acceptance of the terms described in 
// LICENSE.TXT. 
// 
// http://www.freebt.net 
 
#include <windows.h> 
#include <stdio.h> 
 
#include "fbtxcpt.h" 
#include "fbtreg.h" 
 
// Constructor 
CReg::CReg(LPCSTR lpszSubKey, HKEY hRootKey, REGSAM regSam, BOOL bCreate) 
{ 
	FBT_TRY 
 
	m_hRootKey=hRootKey; 
	strcpy(m_szKey, lpszSubKey); 
	Open(lpszSubKey, hRootKey, &m_hKey, regSam, bCreate); 
 
	FBT_CATCH_NORETURN 
 
} 
 
// Destructor 
CReg::~CReg() 
{ 
	FBT_TRY 
 
	if (m_hKey!=NULL) 
		RegCloseKey(m_hKey); 
 
	FBT_CATCH_NORETURN 
 
} 
 
// Create the specified key 
LONG CReg::Create(LPCSTR lpszSubKey, HKEY hRootKey, HKEY *hKey, REGSAM regSam) 
{ 
	FBT_TRY 
 
	DWORD	result; 
	HKEY	*hKeyTemp; 
 
	if (hKey) 
		hKeyTemp=hKey; 
 
	else 
		hKeyTemp=&m_hKey; 
 
	return (RegCreateKeyEx( 
				hRootKey,					// Root key 
				lpszSubKey,					// Subkey name 
				0,							// Reserved 
				"",							// Class name 
				REG_OPTION_NON_VOLATILE,	// Permanent key 
				regSam,						// Desired Security 
				NULL,						// Security descriptor 
				hKeyTemp,					// New key 
				&result));					// Result 
 
	FBT_CATCH_RETURN(!ERROR_SUCCESS) 
 
} 
 
// Open the specified key (create if non-existant) 
LONG CReg::Open(LPCSTR lpszSubKey, HKEY hRootKey, HKEY *hKey, REGSAM regSam, BOOL bCreate) 
{ 
	FBT_TRY 
 
	HKEY *hKeyTemp; 
	if (hKey) 
		hKeyTemp=hKey; 
 
	else 
		hKeyTemp=&m_hKey; 
 
	LONG lRet=RegOpenKeyEx( 
				hRootKey,		// Root key 
				lpszSubKey,		// Sub Key 
				0,				// Reserved 
				regSam,			// Desired Security 
				hKeyTemp);		// New key 
 
	// Couldn't open because key doesn't exist, create it. 
	if (lRet==ERROR_FILE_NOT_FOUND  && bCreate) 
	{ 
		lRet=Create(lpszSubKey, hRootKey, hKey, regSam); 
		lRet=ERROR_SUCCESS; 
 
	} 
 
	return lRet; 
 
	FBT_CATCH_RETURN(!ERROR_SUCCESS) 
 
} 
 
// Get the specified key's value 
BOOL CReg::GetValue(LPCSTR lpszValueName, LPVOID lpvData, DWORD *dwBuffSize, DWORD *dwDataType) 
{ 
	FBT_TRY 
 
	DWORD dwType; 
	DWORD *pType; 
 
	if (dwDataType==NULL) 
		pType=&dwType; 
 
	else 
		pType=dwDataType; 
 
 
	// Get the specified value 
	long bReturn=RegQueryValueEx( 
				m_hKey,							// Previously generated key handle 
				lpszValueName,					// Value name 
				0,								// Reserved 
				pType,							// Type of value 
				(LPBYTE) lpvData,				// Buffer for results 
				dwBuffSize);//==ERROR_SUCCESS);	// Length of buffer 
 
	if (bReturn!=ERROR_SUCCESS) 
		*pType=0; 
 
	return bReturn==ERROR_SUCCESS; 
 
	FBT_CATCH_RETURN(false) 
 
} 
 
BOOL CReg::GetValue(LPCSTR lpszValueName, LPSTR szValue, DWORD dwValueSize) 
{ 
	FBT_TRY 
 
	DWORD	dwBuffSize=dwValueSize; 
	DWORD	dwDataType=REG_SZ; 
	BOOL 	bReturn; 
 
	bReturn=GetValue(lpszValueName, szValue, &dwBuffSize, &dwDataType); 
	if (dwDataType!=REG_SZ) 
		return false; 
 
	return true; 
 
	FBT_CATCH_RETURN(false) 
 
} 
 
/*BOOL CReg::GetValue(LPCSTR lpszValueName, CString &szData, DWORD *dwDataType) 
{ 
	FBT_TRY 
 
	DWORD	dwBuffSize; 
	BOOL 	bReturn; 
	char	szTempBuffer[1024]={0}; 
 
	dwBuffSize=1024; 
	bReturn=GetValue(lpszValueName, szTempBuffer, &dwBuffSize, dwDataType); 
	if (bReturn && strlen(szTempBuffer)>0) 
		szData=szTempBuffer; 
 
	return bReturn; 
 
	FBT_CATCH_RETURN(false) 
 
}*/ 
 
BOOL CReg::GetValue(LPCSTR lpszValueName, DWORD &dwData) 
{ 
	FBT_TRY 
 
	DWORD dwBuffSize=sizeof(DWORD); 
	return GetValue(lpszValueName, &dwData, &dwBuffSize); 
 
	FBT_CATCH_RETURN(false) 
 
} 
 
BOOL CReg::GetValue(LPCSTR lpszValueName, BOOL &bData) 
{ 
	FBT_TRY 
 
	DWORD dwBuffSize=sizeof(BOOL); 
	return GetValue(lpszValueName, &bData, &dwBuffSize); 
 
 
	FBT_CATCH_RETURN(false) 
 
} 
 
// Sets the value of the specified registry key 
BOOL CReg::SetValue(LPCSTR lpszValueName, const LPVOID lpvData, DWORD dwDataSize, DWORD dwType) 
{ 
	FBT_TRY 
 
	// Set the specified value 
	return (RegSetValueEx( 
				m_hKey,							// Previously generated key handle 
				lpszValueName,					// Value name 
				0,								// Reserved 
				dwType,							// Type of value 
				(CONST BYTE *)lpvData,			// Buffer of data 
				dwDataSize)==ERROR_SUCCESS);	// Size of data 
 
	FBT_CATCH_RETURN(false) 
 
} 
 
/*BOOL CReg::SetValue(LPCSTR lpszValueName, CString &szData, DWORD dwDataSize, DWORD dwType) 
{ 
	FBT_TRY 
 
	DWORD dwSize; 
	if (dwDataSize==0) 
		dwSize=szData.GetLength(); 
 
	else 
		dwSize=dwDataSize; 
 
	return SetValue(lpszValueName, (LPVOID)(LPCSTR)szData, dwSize, dwType); 
 
	FBT_CATCH_RETURN(false) 
 
}*/ 
 
BOOL CReg::SetValue(LPCSTR lpszValueName, LPCSTR lpszValue, DWORD dwDataSize, DWORD dwDataType) 
{ 
	FBT_TRY 
 
	DWORD dwTempDataSize=dwDataSize; 
	if (dwDataSize==0) 
		dwTempDataSize=strlen(lpszValue); 
 
	return SetValue(lpszValueName, (LPVOID)lpszValue, dwTempDataSize, dwDataType); 
 
	FBT_CATCH_RETURN(false) 
 
} 
 
BOOL CReg::SetValue(LPCSTR lpszValueName, DWORD dwData) 
{ 
	FBT_TRY 
 
	return SetValue(lpszValueName, (LPVOID)&dwData, sizeof(DWORD), REG_DWORD); 
 
	FBT_CATCH_RETURN(false) 
 
} 
 
BOOL CReg::SetValue(LPCSTR lpszValueName, BOOL bData) 
{ 
	FBT_TRY 
 
	return SetValue(lpszValueName, (DWORD)bData); 
 
	FBT_CATCH_RETURN(false) 
 
} 
 
// Deletes a value 
BOOL CReg::DeleteValue(LPCSTR lpszValueName) 
{ 
	FBT_TRY 
 
	return (RegDeleteValue(m_hKey, lpszValueName)==ERROR_SUCCESS); 
 
	FBT_CATCH_RETURN(false) 
 
} 
 
// Deletes a sub key 
BOOL CReg::DeleteKey(HKEY hRootKey, HKEY hKey, LPCSTR szKey, LPCSTR szSubKey) 
{ 
	FBT_TRY 
 
	DWORD		dwIndex=0; 
	char		szEnumSubKey[1024]; 
	DWORD		dwSubKeySize=1024; 
	char		szKeyClass[1024]; 
	DWORD		dwKeyClassSize=1024; 
	FILETIME	ftLastWrite; 
	HKEY		hSubKey; 
	char		szKeyName[1024]; 
	char		szKeyNameTemp[1024]; 
 
	szKeyName[0]=0; 
	szKeyName[1023]=0; 
	_snprintf(szKeyName, 1024, "%s\\%s", szKey, szSubKey); 
	//szKeyName.Format("%s\\%s", szKey, szSubKey); 
 
	if (Open(szKeyName, hRootKey, &hSubKey, false)!=ERROR_SUCCESS) 
	{ 
		fbtLog(fbtLog_Failure, "Leaving CReg::DeleteKey=false (Failed to open subkey %s)", (LPCSTR)szKeyName); 
		return false; 
 
	} 
 
	while (RegEnumKeyEx(hSubKey, 
						dwIndex++, 
						szEnumSubKey, 
						&dwSubKeySize, 
						NULL, 
						szKeyClass, 
						&dwKeyClassSize, 
						&ftLastWrite)==ERROR_SUCCESS) 
	{ 
		szKeyNameTemp[0]=0; 
		szKeyNameTemp[1023]=0; 
		_snprintf(szKeyNameTemp, 1024, "%s\\%s", szKeyName, szEnumSubKey); 
 
		if (!DeleteKey(hRootKey, hSubKey, szKeyName, szKeyNameTemp)) 
		{ 
			RegCloseKey(hSubKey); 
			return false; 
 
		} 
 
 
	} 
 
	RegCloseKey(hSubKey); 
 
	return (RegDeleteKey(hKey, szSubKey)==ERROR_SUCCESS); 
 
	FBT_CATCH_RETURN(false) 
 
} 
 
// Deletes a sub key 
BOOL CReg::DeleteKey(LPCSTR lpszSubKeyName) 
{ 
	FBT_TRY 
 
	return DeleteKey(m_hRootKey, m_hKey, (LPCSTR)m_szKey, lpszSubKeyName); 
 
	FBT_CATCH_RETURN(false) 
 
} 
 
/*BOOL CReg::EnumerateValues(CStringArray &nszValueNames) 
{ 
	FBT_TRY 
 
	int		nIndex; 
	LONG	lResult=ERROR_SUCCESS; 
	DWORD	dwSize; 
	DWORD	dwType; 
	CString	szName; 
 
	for (nIndex=0; lResult==ERROR_SUCCESS; nIndex++) 
	{ 
		// Read a value name and position from the registry. 
		dwSize=1024; 
		szName.Empty(); 
		lResult=RegEnumValue( 
					m_hKey, 
					nIndex, 
					szName.GetBuffer(1024), 
					&dwSize, 
					NULL, 
					&dwType, 
					NULL, 
					NULL); 
 
		if (lResult==ERROR_SUCCESS && dwType==REG_BINARY) 
 
		{ 
			szName.ReleaseBuffer(); 
			nszValueNames.Add(szName); 
 
		} 
 
	} 
 
	return TRUE; 
 
	FBT_CATCH_RETURN(false) 
 
}*/ 
 
BOOL CReg::DeleteValues() 
{ 
	FBT_TRY 
 
/*	CStringArray nszValues; 
	EnumerateValues(nszValues); 
	for (int i=0; i<nszValues.GetSize(); i++) 
		DeleteValue(nszValues[i]);*/ 
 
	return TRUE; 
 
	FBT_CATCH_RETURN(false) 
 
}