|
|
/*--
Copyright (c) 1995-2000 Microsoft Corporation. All rights reserved. Module Name: CREG.HXX Abstract: Registry helper class --*/
#include "svsutil.hxx"
/////////////////////////////////////////////////////////////////////////////
// CReg: Registry helper class
/////////////////////////////////////////////////////////////////////////////
class CReg { private: HKEY m_hKey; int m_Index; LPBYTE m_lpbValue; // last value read, if any
public: BOOL Create(HKEY hkRoot, LPCTSTR pszKey) { DWORD dwDisp; return ERROR_SUCCESS==RegCreateKeyEx(hkRoot, pszKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &m_hKey, &dwDisp); }
BOOL Open(HKEY hkRoot, LPCTSTR pszKey, REGSAM sam=KEY_READ) { return ERROR_SUCCESS==RegOpenKeyEx(hkRoot, pszKey, 0, sam, &m_hKey); }
CReg(HKEY hkRoot, LPCTSTR pszKey) { m_hKey = NULL; m_Index = 0; m_lpbValue = NULL; Open(hkRoot, pszKey); }
CReg() { m_hKey = NULL; m_Index = 0; m_lpbValue = NULL; }
~CReg() { if(m_hKey) RegCloseKey(m_hKey); if (m_lpbValue) free(m_lpbValue); }
void Reset() { if(m_hKey) RegCloseKey(m_hKey); if (m_lpbValue) free(m_lpbValue); m_hKey = NULL; m_Index = 0; m_lpbValue = NULL; }
operator HKEY() { return m_hKey; }
BOOL IsOK(void) { return m_hKey!=NULL; }
DWORD NumSubkeys() { DWORD nSubKeys = 0; RegQueryInfoKey(m_hKey,0,0,0, &nSubKeys,0,0,0,0,0,0,0); return nSubKeys; }
DWORD NumValues() { DWORD nValues = 0; RegQueryInfoKey(m_hKey,0,0,0,0,0,0,&nValues,0,0,0,0); return nValues; }
BOOL EnumKey(LPTSTR psz, DWORD dwLen) { if(!m_hKey) return FALSE; // Note: EnumKey takes size in chars, not bytes!
return ERROR_SUCCESS==RegEnumKeyEx(m_hKey, m_Index++, psz, &dwLen, NULL, NULL, NULL, NULL); }
BOOL EnumValue(LPTSTR pszName, DWORD dwLenName, LPTSTR pszValue, DWORD dwLenValue) { DWORD dwType; if(!m_hKey) return FALSE; dwLenValue *= sizeof(TCHAR); // convert length in chars to bytes
// Note: EnumValue takes size of Key in chars, but size of Value in bytes!!!
return ERROR_SUCCESS==RegEnumValue(m_hKey, m_Index++, pszName, &dwLenName, NULL, &dwType, (LPBYTE)pszValue, &dwLenValue); }
BOOL ValueSZ(LPCTSTR szName, LPTSTR szValue, DWORD dwLen) { if(!m_hKey) return FALSE; dwLen *= sizeof(TCHAR); // convert length in chars to bytes
return ERROR_SUCCESS==RegQueryValueEx(m_hKey, szName, NULL, NULL, (LPBYTE)szValue, &dwLen); }
DWORD ValueBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen) { if(!m_hKey) return 0; DWORD dwLenWant = dwLen; if(ERROR_SUCCESS==RegQueryValueEx(m_hKey, szName, NULL, NULL, lpbValue, &dwLen)) return dwLen; else return 0; }
LPCTSTR CReg::ValueSZ(LPCTSTR szName) { if(!m_hKey) return FALSE; DWORD dwLen = 0; if( (ERROR_SUCCESS != RegQueryValueEx(m_hKey, szName, NULL, NULL, NULL, &dwLen)) || (dwLen == 0) ) return NULL;
if (m_lpbValue) free(m_lpbValue);
if( !(m_lpbValue = (BYTE *)malloc(dwLen)) || (ERROR_SUCCESS != RegQueryValueEx(m_hKey, szName, NULL, NULL, m_lpbValue, &dwLen)) ) return NULL; return (LPTSTR)m_lpbValue; }
LPBYTE ValueBinary(LPCTSTR szName) { return (LPBYTE)ValueSZ(szName); }
DWORD ValueDW(LPCTSTR szName, DWORD dwDefault=0) { DWORD dwValue = dwDefault; if(m_hKey) { DWORD dwLen = sizeof(DWORD); RegQueryValueEx(m_hKey, szName, NULL, NULL, (LPBYTE)&dwValue, &dwLen); } return dwValue; }
BOOL SetSZ(LPCTSTR szName, LPCTSTR szValue, DWORD dwLen) { return ERROR_SUCCESS==RegSetValueEx(m_hKey, szName, 0, REG_SZ, (LPBYTE)szValue, sizeof(TCHAR)*dwLen); }
BOOL SetSZ(LPCTSTR szName, LPCTSTR szValue) { return SetSZ(szName, szValue, 1+lstrlen(szValue)); }
BOOL SetDW(LPCTSTR szName, DWORD dwValue) { return ERROR_SUCCESS==RegSetValueEx(m_hKey, szName, 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD)); }
BOOL SetBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen) { return ERROR_SUCCESS==RegSetValueEx(m_hKey, szName, 0, REG_BINARY, lpbValue, dwLen); }
BOOL SetMultiSZ(LPCTSTR szName, LPCTSTR lpszValue, DWORD dwLen) { return ERROR_SUCCESS==RegSetValueEx(m_hKey, szName, 0, REG_MULTI_SZ, (LPBYTE)lpszValue, sizeof(TCHAR)*dwLen); }
BOOL DeleteValue(LPCTSTR szName) { return ERROR_SUCCESS==RegDeleteValue(m_hKey, szName); }
};
|