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)
}