//+------------------------------------------------------------------------- // Microsoft OLE // Copyright (C) Microsoft Corporation, 1993 - 1995. // // File: creghelp.cxx // // Contents: Implementaion of CRegistryHelp class object. // // Classes: CRegistryHelp // // Functions: CRegistryHelp::CRegistryHelp // CRegistryHelp::~CRegistryHelp // CRegistryHelp::GetValue // CRegistryHelp::GetValueDword // CRegistryHelp::GetValueString // CRegistryHelp::SetValue // CRegistryHelp::SetValueDword // CRegistryHelp::SetValueString // CRegistryHelp::DeleteValue // CRegistryHelp::DeleteSubKey // // History: 03-Sep-93 XimingZ Created // 23-Nov-94 DeanE Modified for general use //-------------------------------------------------------------------------- #include #pragma hdrstop //+------------------------------------------------------------------------- // Method: CRegistryHelp::CRegistryHelp // // Synopsis: Constructor. // // Arguments: [hKey] - Handle to the root key. // [pszSubKey] - Name of subkey. // [fOptions] - Special options. // [samKey] - Access desired. // [phr] - Pointer to status code to be returned. // // History: 20-Oct-93 XimingZ Created //-------------------------------------------------------------------------- CRegistryHelp::CRegistryHelp( HKEY hKey, LPTSTR pszSubKey, DWORD fOptions, REGSAM samKey, HRESULT *phr) : _hKey(NULL), _hSubKey(NULL), _pszSubKey(NULL), _fOptions(fOptions) { DWORD dwDisposition; LONG lRes; // Confirm subkey is valid and save it if (IsBadReadPtr(pszSubKey, sizeof(LPTSTR))) { *phr = E_POINTER; return; } _pszSubKey = new(NullOnFail) TCHAR[lstrlen(pszSubKey)+1]; if (_pszSubKey == NULL) { *phr = E_OUTOFMEMORY; return; } lstrcpy(_pszSubKey, pszSubKey); // Save hKey if (hKey == NULL) { *phr = MAKE_TH_ERROR_CODE(E_HANDLE); return; } _hKey = hKey; // Open the subkey and save a handle to it lRes = RegCreateKeyEx( hKey, pszSubKey, 0, NULL, fOptions, samKey, NULL, &_hSubKey, &dwDisposition); if (lRes != ERROR_SUCCESS) { *phr = MAKE_TH_ERROR_CODE(lRes); delete _pszSubKey; _hSubKey = NULL; _pszSubKey = NULL; } else { *phr = S_OK; } } //+------------------------------------------------------------------------- // Function: CRegistryHelp::~CRegistryHelp // // Synopsis: Destructor. // // Arguments: None // // History: 20-Oct-93 XimingZ Created //-------------------------------------------------------------------------- CRegistryHelp::~CRegistryHelp() { delete _pszSubKey; if (_hSubKey != NULL) { RegCloseKey(_hSubKey); } } //+------------------------------------------------------------------------- // Member: CRegistryHelp::GetValue // // Synopsis: Retrieves a value for some subkey and value name. // // Arguments: [pszSubKey] - Subkey the value is on. NULL means _hSubKey. // [pszValue] - Name of value to query. // [pbBuffer] - Holds retrieved data. // [pcbBuffer] - Holds size of buffer on entry and actual size // on exit (in bytes). // [pfType] - Holds type of data retrieved. // // Returns: S_OK for success or an error code. // // History: 20-Oct-93 XimingZ Created //-------------------------------------------------------------------------- HRESULT CRegistryHelp::GetValue( LPTSTR pszSubKey, LPTSTR pszValue, LPBYTE pbBuffer, LPDWORD pcbBuffer, LPDWORD pfType) { HRESULT hr = E_FAIL; HKEY hSubKey = NULL; LONG lRes; // Open the subkey, if necessary if (NULL == pszSubKey) { hSubKey = _hSubKey; hr = S_OK; } else { lRes = RegOpenKeyEx(_hSubKey, pszSubKey, NULL, KEY_READ, &hSubKey); hr = (lRes == ERROR_SUCCESS) ? S_OK : MAKE_TH_ERROR_CODE(lRes); } // Query for the data if (SUCCEEDED(hr)) { lRes = RegQueryValueEx( hSubKey, pszValue, NULL, pfType, pbBuffer, pcbBuffer); hr = (lRes == ERROR_SUCCESS) ? S_OK : MAKE_TH_ERROR_CODE(lRes); } // Close the subkey handle, if we opened it if (hSubKey != _hSubKey) { RegCloseKey(hSubKey); } return(hr); } //+------------------------------------------------------------------------- // Member: CRegistryHelp::GetValueDword // // Synopsis: Retrieves a value for some subkey and value name that has // REG_DWORD, REG_DWORD_LITTLE_ENDIAN, or REG_DWORD_BIG_ENDIAN // data. Other data types return an error. // // Arguments: [pszSubKey] - Subkey the value is on. NULL means // _hSubKey. // [pszValue] - Name of value to query. // [pdwData] - Holds retrieved data. // [fExpectedType] - Holds expected type. // // Returns: S_OK for success or an error code. // // History: 20-Oct-93 XimingZ Created //-------------------------------------------------------------------------- HRESULT CRegistryHelp::GetValueDword( LPTSTR pszSubKey, LPTSTR pszValue, LPDWORD pdwData, DWORD fExpectedType) { HRESULT hr = E_FAIL; DWORD cbData = sizeof(DWORD); DWORD fType; // Check fExpectedType is for a DWORD data type if ((fExpectedType != REG_DWORD) && (fExpectedType != REG_DWORD_LITTLE_ENDIAN) && (fExpectedType != REG_DWORD_BIG_ENDIAN)) { return(MAKE_TH_ERROR_CODE(ERROR_INVALID_PARAMETER)); } // Get the value hr = GetValue(pszSubKey, pszValue, (PBYTE)pdwData, &cbData, &fType); if (SUCCEEDED(hr)) { if ((fType == fExpectedType) && (cbData == sizeof(DWORD))) { hr = S_OK; } else { hr = E_FAIL; } } return(hr); } //+------------------------------------------------------------------------- // Member: CRegistryHelp::GetValueString // // Synopsis: Retrieves a value for some subkey and value name that has // REG_SZ, REG_EXPAND_SZ, and REG_MULTI_SZ type data. // // Arguments: [pszSubKey] - Subkey the value is on. NULL means // _hSubKey. // [pszValue] - Name of value to query. // [pszData] - Holds retrieved data. // [pcbData] - Size of data buffer in bytes. // [fExpectedType] - Holds expected type. // // Returns: S_OK for success or an error code. // // History: 20-Oct-93 XimingZ Created //-------------------------------------------------------------------------- HRESULT CRegistryHelp::GetValueString( LPTSTR pszSubKey, LPTSTR pszValue, LPTSTR pszData, LPDWORD pcbData, DWORD fExpectedType) { HRESULT hr = E_FAIL; DWORD fType; // Check fExpectedType is for a DWORD data type if ((fExpectedType != REG_SZ) && (fExpectedType != REG_EXPAND_SZ) && (fExpectedType != REG_MULTI_SZ)) { return(MAKE_TH_ERROR_CODE(ERROR_INVALID_PARAMETER)); } hr = GetValue(pszSubKey, pszValue, (PBYTE)pszData, pcbData, &fType); if (SUCCEEDED(hr)) { if (fType == fExpectedType) { hr = S_OK; } else { hr = E_FAIL; } } return(hr); } //+------------------------------------------------------------------------- // Member: CRegistryHelp::SetValue // // Synopsis: Stores a value for a given subkey and value name. Subkey // is expected to exist. // // Arguments: [pszSubKey] - Subkey the value is on. NULL means // _hSubKey. // [pszValue] - Name of value to set. // [pbData] - Address of value data. // [cbData] - Size of data. // [fType] - Type of data. // // Returns: S_OK if value is set properly, error code if not. // // History: 20-Oct-93 XimingZ Created //-------------------------------------------------------------------------- HRESULT CRegistryHelp::SetValue( LPTSTR pszSubKey, LPTSTR pszValue, LPBYTE pbData, DWORD cbData, DWORD fType) { HRESULT hr = E_FAIL; LONG lRes; HKEY hSubKey; // Open the subkey, if necessary if (pszSubKey == NULL) { hSubKey = _hSubKey; hr = S_OK; } else { lRes = RegOpenKeyEx(_hSubKey, pszSubKey, NULL, KEY_WRITE, &hSubKey); hr = (lRes == ERROR_SUCCESS) ? S_OK : MAKE_TH_ERROR_CODE(lRes); } // Set the data if (SUCCEEDED(hr)) { lRes = RegSetValueEx(hSubKey, pszValue, 0, fType, pbData, cbData); hr = (lRes == ERROR_SUCCESS) ? S_OK : MAKE_TH_ERROR_CODE(lRes); } // Close the subkey handle, if we opened it if (hSubKey != _hSubKey) { RegCloseKey(hSubKey); } return(hr); } //+------------------------------------------------------------------------- // Member: CRegistryHelp::SetValueDword // // Synopsis: Stores a DWORD value for some subkey and value name under // this subkey. Type flag passed must be REG_DWORD, // REG_DWORD_LITTLE_ENDIAN, or REG_DWORD_BIG_ENDIAN. // // Arguments: [pszSubKey] - Subkey the value is on. NULL means _hSubKey. // [pszValue] - Name of value to set. // [dwData] - Data to set. // [fType] - Type of data. // // Returns: S_OK if value is set properly, error code if not. // // History: 20-Oct-93 XimingZ Created //-------------------------------------------------------------------------- HRESULT CRegistryHelp::SetValueDword( LPTSTR pszSubKey, LPTSTR pszValue, DWORD dwData, DWORD fType) { HRESULT hr = E_FAIL; // Check fType is for a DWORD data type if ((fType != REG_DWORD) && (fType != REG_DWORD_LITTLE_ENDIAN) && (fType != REG_DWORD_BIG_ENDIAN)) { return(MAKE_TH_ERROR_CODE(ERROR_INVALID_PARAMETER)); } // Set the value hr = SetValue( pszSubKey, pszValue, (LPBYTE)&dwData, sizeof(DWORD), fType); return(hr); } //+------------------------------------------------------------------------- // Member: CRegistryHelp::SetValueString // // Synopsis: Stores a string value for some subkey and value name under // this subkey. Type flag passed must be REG_SZ, // REG_EXPAND_SZ, or REG_MULTI_SZ. // // Arguments: [pszSubKey] - Subkey the value is on. NULL means _hSubKey. // [pszValue] - Name of value to set. // [pszData] - Data to set. // [cbData] - Size of data, in bytes. // [fType] - Type of data. // // Returns: S_OK if value is set properly, error code if not. // // History: 20-Oct-93 XimingZ Created //-------------------------------------------------------------------------- HRESULT CRegistryHelp::SetValueString( LPTSTR pszSubKey, LPTSTR pszValue, LPTSTR pszData, DWORD cbData, DWORD fType) { HRESULT hr = E_FAIL; // Check fType is for a DWORD data type if ((fType != REG_SZ) && (fType != REG_EXPAND_SZ) && (fType != REG_MULTI_SZ)) { return(MAKE_TH_ERROR_CODE(ERROR_INVALID_PARAMETER)); } // Set the value hr = SetValue( pszSubKey, pszValue, (LPBYTE)pszData, cbData, fType); return(hr); } //+------------------------------------------------------------------------- // Member: CRegistryHelp::DeleteValue // // Synopsis: Delete a named value under a given subkey. // // Arguments: [pszSubKey] - Subkey the value is on. NULL means _hSubKey. // [pszValue] - Value to delete. // // Returns: S_OK if value deleted or is not there, error code if not // deleted. // // History: 20-Oct-93 XimingZ Created //-------------------------------------------------------------------------- HRESULT CRegistryHelp::DeleteValue(LPTSTR pszSubKey, LPTSTR pszValue) { HRESULT hr = E_FAIL; HKEY hSubKey; LONG lRes; // Open the subkey, if necessary if (pszSubKey == NULL) { hSubKey = _hSubKey; } else { lRes = RegOpenKeyEx(_hSubKey, pszSubKey, NULL, KEY_WRITE, &hSubKey); hr = (lRes == ERROR_SUCCESS) ? S_OK : MAKE_TH_ERROR_CODE(lRes); } // Delete the value if (SUCCEEDED(hr)) { lRes = RegDeleteValue(hSubKey, pszValue); hr = (lRes == ERROR_SUCCESS) ? S_OK : MAKE_TH_ERROR_CODE(lRes); } // Close the subkey handle, if we opened it if (hSubKey != _hSubKey) { RegCloseKey(hSubKey); } return(hr); } //+------------------------------------------------------------------------- // Member: CRegistryHelp::DeleteSubKey // // Synopsis: Delete the subkey passed under this subkey. // // Arguments: [pszSubKey] - Subkey to delete. Must have no child // subkeys. // // Returns: S_OK if value deleted or is not there, error code if not // deleted. // // History: 20-Oct-93 XimingZ Created //-------------------------------------------------------------------------- HRESULT CRegistryHelp::DeleteSubKey(LPTSTR pszSubKey) { LONG lRes; HRESULT hr; if (IsBadReadPtr(pszSubKey, sizeof(LPTSTR))) { hr = MAKE_TH_ERROR_CODE(ERROR_INVALID_PARAMETER); } else { lRes = RegDeleteKey(_hSubKey, pszSubKey); hr = (lRes == ERROR_SUCCESS) ? S_OK : MAKE_TH_ERROR_CODE(lRes); } return(hr); }