#include "stdafx.h"
#include <winreg.h>
#include "Registry.h"
#define CLASS_NAME_LENGTH 255
/* IMPORTANT NOTES ABOUT CREGISTRY:
CRegistry never keeps a key open past the end of a function call.
This is incase the application crashes before the next call to close
the registry
INCLUDE FILES
"winreg.h" and "afxdisp.h" must be included in "stdafx.h"
KEY NAMES:
Key names must not begin with a \ and only absolute strings are accepted
*/
CRegistry::CRegistry()
{
m_hRootKey = HKEY_CURRENT_USER;
m_bLazyWrite = TRUE;
m_nLastError = ERROR_SUCCESS;
}
CRegistry::~CRegistry()
{
ClearKey();
}
BOOL CRegistry::ClearKey()
{
/* Call CloseKey to write the current key to the registry and close the
key. An application should not keep keys open any longer than necessary.
Calling CloseKey when there is no current key has no effect.*/
m_strCurrentPath.Empty();
m_hRootKey = HKEY_CURRENT_USER;
m_bLazyWrite = TRUE;
return TRUE;
}
BOOL CRegistry::SetRootKey(HKEY hRootKey)
{
// sets the root key
// make sure to set it to a valid key
if (hRootKey != HKEY_CLASSES_ROOT &&
hRootKey != HKEY_CURRENT_USER &&
hRootKey != HKEY_LOCAL_MACHINE &&
hRootKey != HKEY_USERS) return FALSE;
m_hRootKey = hRootKey;
return TRUE;
}
BOOL CRegistry::CreateKey(CString strKey)
{
/* Use CreateKey to add a new key to the registry.
Key is the name of the key to create. Key must be
an absolute name. An absolute key
begins with a backslash (\) and is a subkey of
the root key. */
ASSERT(strKey[0] != '\\');
HKEY hKey;
DWORD dwDisposition = 0;
if (::RegCreateKeyEx(m_hRootKey, LPCTSTR(strKey), 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey,
&dwDisposition) != ERROR_SUCCESS) return FALSE;
if (!m_bLazyWrite) ::RegFlushKey(hKey);
::RegCloseKey(hKey);
m_strCurrentPath = strKey;
return TRUE;
}
BOOL CRegistry::DeleteKey(CString strKey)
{
/* Call DeleteKey to remove a specified key and its associated data,
if any, from the registry. Returns FALSE is there are subkeys
Subkeys must be explicitly deleted by separate calls to DeleteKey.
DeleteKey returns True if key deletion is successful. On error,
DeleteKey returns False. */
// need to open the key first with RegOpenKeyEx
ASSERT(FALSE); // not yet implemented
ASSERT(strKey[0] != '\\');
if (!KeyExists(strKey)) return TRUE;
if (::RegDeleteKey(m_hRootKey, strKey) != ERROR_SUCCESS) return FALSE;
return TRUE;
}
BOOL CRegistry::DeleteValue(CString strName)
{
/* Call DeleteValue to remove a specific data value
associated with the current key. Name is string
containing the name of the value to delete. Keys can contain
multiple data values, and every value associated with a key
has a unique name. */
ASSERT(m_strCurrentPath.GetLength() > 0);
HKEY hKey;
LONG lResult;
if (::RegOpenKeyEx(m_hRootKey, LPCTSTR(m_strCurrentPath), 0,
KEY_SET_VALUE, &hKey) != ERROR_SUCCESS) return FALSE;
lResult = ::RegDeleteValue(hKey, LPCTSTR(strName));
::RegCloseKey(hKey);
if (lResult == ERROR_SUCCESS) return TRUE;
return FALSE;
}
int CRegistry::GetDataSize(CString strValueName)
{
/* Call GetDataSize to determine the size, in bytes, of
a data value associated with the current key. ValueName
is a string containing the name of the data value to query.
On success, GetDataSize returns the size of the data value.
On failure, GetDataSize returns -1. */
HKEY hKey;
ASSERT(m_strCurrentPath.GetLength() > 0);
LONG lResult;
if (::RegOpenKeyEx(m_hRootKey, LPCTSTR(m_strCurrentPath), 0,
KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) return -1;
DWORD dwSize = 1;
lResult = ::RegQueryValueEx(hKey, LPCTSTR(strValueName),
NULL, NULL, NULL, &dwSize);
::RegCloseKey(hKey);
if (lResult != ERROR_SUCCESS) return -1;
return (int)dwSize;
}
DWORD CRegistry::GetDataType(CString strValueName)
{
HKEY hKey;
ASSERT(m_strCurrentPath.GetLength() > 0);
m_nLastError = ::RegOpenKeyEx(m_hRootKey, LPCTSTR(m_strCurrentPath), 0,
KEY_QUERY_VALUE, &hKey);
if (m_nLastError != ERROR_SUCCESS) return 0;
DWORD dwType = 1;
m_nLastError = ::RegQueryValueEx(hKey, LPCTSTR(strValueName),
NULL, &dwType, NULL, NULL);
::RegCloseKey(hKey);
if (m_nLastError == ERROR_SUCCESS) return dwType;
return 0;
}
int CRegistry::GetSubKeyCount()
{
/* Call this function to determine the number of subkeys.
the function returns -1 on error */
HKEY hKey;
ASSERT(m_strCurrentPath.GetLength() > 0);
if (::RegOpenKeyEx(m_hRootKey, LPCTSTR(m_strCurrentPath), 0,
KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS) return -1;
LONG lResult;
DWORD dwSubKeyCount, dwValueCount, dwClassNameLength,
dwMaxSubKeyName, dwMaxValueName, dwMaxValueLength;
FILETIME ftLastWritten;
_TCHAR szClassBuffer[CLASS_NAME_LENGTH];
dwClassNameLength = CLASS_NAME_LENGTH;
lResult = ::RegQueryInfoKey(hKey, szClassBuffer, &dwClassNameLength,
NULL, &dwSubKeyCount, &dwMaxSubKeyName, NULL, &dwValueCount,
&dwMaxValueName, &dwMaxValueLength, NULL, &ftLastWritten);
::RegCloseKey(hKey);
if (lResult != ERROR_SUCCESS) return -1;
return (int)dwSubKeyCount;
}
int CRegistry::GetValueCount()
{
/* Call this function to determine the number of subkeys.
the function returns -1 on error */
HKEY hKey;
ASSERT(m_strCurrentPath.GetLength() > 0);
if (::RegOpenKeyEx(m_hRootKey, LPCTSTR(m_strCurrentPath), 0,
KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS) return -1;
LONG lResult;
DWORD dwSubKeyCount, dwValueCount, dwClassNameLength,
dwMaxSubKeyName, dwMaxValueName, dwMaxValueLength;
FILETIME ftLastWritten;
_TCHAR szClassBuffer[CLASS_NAME_LENGTH];
dwClassNameLength = CLASS_NAME_LENGTH;
lResult = ::RegQueryInfoKey(hKey, szClassBuffer, &dwClassNameLength,
NULL, &dwSubKeyCount, &dwMaxSubKeyName, NULL, &dwValueCount,
&dwMaxValueName, &dwMaxValueLength, NULL, &ftLastWritten);
::RegCloseKey(hKey);
if (lResult != ERROR_SUCCESS) return -1;
return (int)dwValueCount;
}
BOOL CRegistry::KeyExists(CString strKey, HKEY hRootKey)
{
/* Call KeyExists to determine if a key of a specified name exists.
Key is the name of the key for which to search. */
ASSERT(strKey[0] != '\\');
HKEY hKey;
if (hRootKey == NULL) hRootKey = m_hRootKey;
LONG lResult = ::RegOpenKeyEx(hRootKey, LPCTSTR(strKey), 0,
KEY_ALL_ACCESS, &hKey);
::RegCloseKey(hKey);
if (lResult == ERROR_SUCCESS) return TRUE;
return FALSE;
}
BOOL CRegistry::SetKey(CString strKey, BOOL bCanCreate)
{
/* Call SetKey to make a specified key the current key. Key is the
name of the key to open. If Key is null, the CurrentKey property
is set to the key specified by the RootKey property.
CanCreate specifies whether to create the specified key if it does
not exist. If CanCreate is True, the key is created if necessary.
Key is opened or created with the security access value KEY_ALL_ACCESS.
OpenKey only creates non-volatile keys, A non-volatile key is stored in
the registry and is preserved when the system is restarted.
OpenKey returns True if the key is successfully opened or created */
ASSERT(strKey[0] != '\\');
HKEY hKey;
// close the current key if it is open
if (strKey.GetLength() == 0)
{
m_strCurrentPath.Empty();
return TRUE;
}
DWORD dwDisposition;
if (bCanCreate) // open the key with RegCreateKeyEx
{
if (::RegCreateKeyEx(m_hRootKey, LPCTSTR(strKey), 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey,
&dwDisposition) != ERROR_SUCCESS) return FALSE;
m_strCurrentPath = strKey;
if (!m_bLazyWrite) ::RegFlushKey(hKey);
::RegCloseKey(hKey);
return TRUE;
}
// otherwise, open the key without creating
// open key requires no initial slash
m_nLastError = ::RegOpenKeyEx(m_hRootKey, LPCTSTR(str
- 1
- 2
前往页