/////////////////////////////////////////////////////////////////////////////
// Copyright (C) 1998 by Shane Martin
// All rights reserved
//
// Distribute freely, except: don't remove my name from the source or
// documentation (don't take credit for my work), mark your changes (don't
// get me blamed for your possible bugs), don't alter or remove this
// notice.
// No warrantee of any kind, express or implied, is included with this
// software; use at your own risk, responsibility for damages (if any) to
// anyone resulting from the use of this software rests entirely with the
// user.
//
// Send bug reports, bug fixes, enhancements, requests, flames, etc., and
// I'll try to keep a version up to date. I can be reached as follows:
// shane.kim@kaiserslautern.netsurf.de
/////////////////////////////////////////////////////////////////////////////
// last revised: 24 Apr 98
// Registry.cpp : implementation file
//
// Description:
// CRegistry is a wrapper for the Windows Registry API. It allows
// easy modification of the Registry with easy to remember terms like
// Read, Write, Open, and Close.
#include "stdafx.h"
#include "Registry.h"
#include "common.h"
#define READ_ONLY_KEYS (KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY)
CRegistry::CRegistry(BOOL bAdmin, BOOL bReadOnly) :
m_bReadOnly (bReadOnly)
{
m_hKey = bAdmin ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
}
CRegistry::~CRegistry()
{
Close();
}
BOOL CRegistry::EnumKey(int index, CString& keyName)
{
DWORD buffSize = 256;
LPTSTR buff = keyName.GetBuffer(buffSize);
LONG ReturnValue = RegEnumKeyEx(m_hKey, (DWORD) index, buff, &buffSize, 0, NULL, 0, 0);
keyName.ReleaseBuffer();
if(ReturnValue == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
void CRegistry::Attach(HKEY hKey)
{
Close();
m_hKey = hKey;
m_sPath.Empty();
}
HKEY CRegistry::Detach()
{
HKEY ret = m_hKey;
m_hKey = 0;
m_sPath.Empty();
return ret;
}
BOOL CRegistry::RecursiveDeleteKey(LPCTSTR pszPath, BOOL bAdmin)
{
ASSERT(pszPath);
CRegistry tmp(bAdmin, false);
if(!tmp.Open(pszPath))
return FALSE;
CString subkey;
BOOL bSuccess = TRUE;
while(bSuccess && tmp.EnumKey(0, subkey))
{
CString path(pszPath);
path.TrimRight("\\");
path += _T("\\") + subkey;
bSuccess = RecursiveDeleteKey(path, bAdmin);
}
tmp.Close();
return DeleteKey(pszPath, bAdmin);
}
BOOL CRegistry::VerifyKey (LPCTSTR pszPath)
{
ASSERT (m_hKey);
CString strPath = pszPath;
int iPathLen = strPath.GetLength ();
if (iPathLen > 0 && strPath [iPathLen - 1] == _T('\\'))
{
strPath = strPath.Left (iPathLen - 1);
}
LONG ReturnValue = RegOpenKeyEx (m_hKey, strPath, 0L,
m_bReadOnly ? READ_ONLY_KEYS : KEY_ALL_ACCESS, &m_hKey);
m_Info.lMessage = ReturnValue;
m_Info.dwSize = 0L;
m_Info.dwType = 0L;
if(ReturnValue == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::VerifyValue (LPCTSTR pszValue)
{
ASSERT(m_hKey);
LONG lReturn = RegQueryValueEx(m_hKey, pszValue, NULL,
NULL, NULL, NULL);
m_Info.lMessage = lReturn;
m_Info.dwSize = 0L;
m_Info.dwType = 0L;
if(lReturn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::CreateKey (LPCTSTR pszPath)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
ASSERT (pszPath != NULL);
HKEY hKeySave = m_hKey;
CString strPath = pszPath;
int iPathLen = strPath.GetLength ();
if (iPathLen > 0 && strPath [iPathLen - 1] == _T('\\'))
{
strPath = strPath.Left (iPathLen - 1);
}
DWORD dw;
LONG ReturnValue = RegCreateKeyEx (m_hKey, strPath, 0L, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
&m_hKey, &dw);
m_Info.lMessage = ReturnValue;
m_Info.dwSize = 0L;
m_Info.dwType = 0L;
if(ReturnValue == ERROR_SUCCESS)
{
if(hKeySave)
RegCloseKey(hKeySave);
return TRUE;
}
DebugMsg(_T("Can't create registry key: %s\n"), strPath);
m_hKey = hKeySave;
return FALSE;
}
BOOL CRegistry::Open (LPCTSTR pszPath)
{
ASSERT (pszPath != NULL);
HKEY hKeySave = m_hKey;
m_sPath = pszPath;
CString strPath = pszPath;
int iPathLen = strPath.GetLength ();
if (iPathLen > 0 && strPath [iPathLen - 1] == _T('\\'))
{
strPath = strPath.Left (iPathLen - 1);
}
LONG ReturnValue = RegOpenKeyEx (m_hKey, strPath, 0L,
m_bReadOnly ? READ_ONLY_KEYS : KEY_ALL_ACCESS, &m_hKey);
m_Info.lMessage = ReturnValue;
m_Info.dwSize = 0L;
m_Info.dwType = 0L;
if(ReturnValue == ERROR_SUCCESS)
{
if(hKeySave)
RegCloseKey(hKeySave);
return TRUE;
}
m_hKey = hKeySave;
return FALSE;
}
void CRegistry::Close()
{
if (m_hKey)
{
RegCloseKey (m_hKey);
m_hKey = NULL;
}
}
BOOL CRegistry::Write (LPCTSTR pszKey, int iVal)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
DWORD dwValue;
ASSERT(m_hKey);
dwValue = (DWORD)iVal;
LONG ReturnValue = RegSetValueEx (m_hKey, pszKey, 0L, REG_DWORD,
(CONST BYTE*) &dwValue, sizeof(DWORD));
m_Info.lMessage = ReturnValue;
m_Info.dwSize = sizeof(DWORD);
m_Info.dwType = REG_DWORD;
if(ReturnValue == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::Write (LPCTSTR pszKey, DWORD dwVal)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
ASSERT(m_hKey);
return RegSetValueEx (m_hKey, pszKey, 0L, REG_DWORD,
(CONST BYTE*) &dwVal, sizeof(DWORD));
}
BOOL CRegistry::Write (LPCTSTR pszKey, LPCTSTR pszData)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
ASSERT(m_hKey);
ASSERT(pszData);
ASSERT(AfxIsValidAddress(pszData, _tcslen(pszData), FALSE));
LONG ReturnValue = RegSetValueEx (m_hKey, pszKey, 0L, REG_SZ,
(CONST BYTE*) pszData, (ULONG) _tcslen(pszData) + 1);
m_Info.lMessage = ReturnValue;
m_Info.dwSize = (DWORD) _tcslen(pszData) + 1;
m_Info.dwType = REG_SZ;
if(ReturnValue == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::Write (LPCTSTR pszKey, CStringList& scStringList)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
ASSERT(m_hKey);
const int iMaxChars = 4096;
BYTE* byData = (BYTE*)::calloc(iMaxChars, sizeof(TCHAR));
ASSERT(byData);
CMemFile file(byData, iMaxChars, 16);
CArchive ar(&file, CArchive::store);
ASSERT(scStringList.IsSerializable());
scStringList.Serialize(ar);
ar.Close();
ASSERT(file.GetLength() < iMaxChars);
const DWORD dwLen = (DWORD) file.GetLength();
LONG lReturn = RegSetValueEx(m_hKey, pszKey, 0, REG_BINARY,
file.Detach(), dwLen);
m_Info.lMessage = lReturn;
m_Info.dwSize = dwLen;
m_Info.dwType = REG_BINARY;
if(byData)
{
free(byData);
byData = NULL;
}
if(lReturn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::Write (LPCTSTR pszKey, CObList& list)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
BOOL bRes = FALSE;
try
{
CMemFile file;
{
CArchive ar (&file, CArchive::store);
list.Serialize (ar);
ar.Flush ();
}
DWORD dwDataSize = (DWORD) file.GetLength ();
LPBYTE lpbData = file.Detach ();
if (lpbData == NULL)
{
return FALSE;
}
bRes = Write (pszKey, lpbData, (UINT) dwDataSize);
free (lpbData);
}
catch (CMemoryException* pEx)
{
pEx->Delete ();
TRACE(_T("Memory exception in CRegistry::Write ()!\n"));
return FALSE;
}
return bRes;
}
BOOL CRegistry::Write (LPCTSTR pszKey, CObject& obj)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
BOOL bRes = FALSE;
try
{
CMemFile file;
{
CArchive ar (&file, CArchive::store);
obj.Serialize (ar);
ar.Flush ();
}
DWORD dwDataSize = (DWORD) file.GetLength ();
LPBYTE lpbData = file.Detach ();
if (lpbData == NULL)
{
return FALSE;
}
bRes = Write (pszKey, lpbData, (UINT) dwDataSize);
free (lpbData);
}
catch (CMemoryException* pEx)
{
pEx->Delete ();
TRACE(_T("Memory exception in CRegistry::Write ()!\n"));
return FALSE;
}
return bRes;
}
BOOL CRegistry::Write (LPCTSTR pszKey, CByteArray& bcArray)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
ASSERT(m_hKey);
const int iMaxChars = 4096;
BYTE* byData = (BYTE*)::calloc(iMaxChars, sizeof(TCHAR));
ASSERT(byData);
CMemFile file(byData, iMaxChars, 16);
CArchive ar(&file, CArchive::store);
ASSERT(bcArray.IsSerializable());
bcArray.Serialize(ar);
ar.Close();
const DWORD dwLen = (DWORD) file.GetLength();
ASSERT(dwLen < iMaxChars);
LONG lReturn = RegSetValueEx(m_hKey, pszKey, 0, REG_BINARY,
file.Detach(), dwLen);
m_Info.lMessage = lReturn;
m_Info.dwSize = dwLen;
m_Info.dwType = REG_BINARY;
if(byData)
{
free(byData);
byData = NULL;
}
if(lReturn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::Write (LPCTSTR pszKey, CDWordArray& dwcArray)
{
ASSERT (m_hKey != NULL);
ASSERT (pszKey != NULL);
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
BOOL bRes = FALSE;
try
{
CMemFile file;
{
CArchive ar (&file, CArchive::store);
dwcArray.Serialize(ar);
ar.Flush ();
}
DWORD dwDataSize = (DWORD) file.GetLength ();
LPBYTE lpbData = file.Detach ();
if (lpbData == NULL)
{
return FALSE;
}
bRes = Write (pszKey, lpbData, (UINT) dwDataSize);
free (lpbData);
}
catch (CMemoryException* pEx)
{
pEx->Delete ();
TRACE(_T("Memory exception in CRegistry::Write ()!\n"));
return FALSE;
}
return bRes;
}
BOOL CRegistry::Write (LPCTSTR pszKey, CWordArray& wcArray)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
BOOL bRes = FALSE;
try
{
CMemFile file;
{
CArchive ar (&file, CArchive::store);
ar << (int) wcArray.GetSize ();
for (int i = 0; i < wcArray.GetSize (); i ++)
{
ar << wcArray [i];
}
ar.Flush ();
}
DWORD dwDataSize = (DWORD) file.GetLength ();
LPBYTE lpbData = file.Detach ();
if (lpbData == NULL)
{
return FALSE;
}
bRes = Write (pszKey, lpbData, (UINT) dwDataSize);
free (lpbData);
}
catch (CMemoryException* pEx)
{
pEx->Delete ();
TRACE(_T("Memory exception in CRegistry::Write ()!\n"));
return FALSE;
}
return bRes;
}
BOOL CRegistry::Write (LPCTSTR pszKey, CStringArray& scArray)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
ASSERT(m_hKey);
const int iMaxChars = 4096;
BYTE* byData = (BYTE*)::calloc(iMaxChars, sizeof(TCHAR));
ASSERT(byData);
CMemFile file(byData, iMaxChars, 16);
CArchive ar(&file, CArchive::store);
ASSERT(scArray.IsSerializable());
scArray.Serialize(ar);
ar.Close();
const DWORD dwLen = (DWORD) file.GetLength();
ASSERT(dwLen < iMaxChars);
LONG lReturn = RegSetValueEx(m_hKey, pszKey, 0, REG_BINARY,
file.Detach(), dwLen);
m_Info.lMessage = lReturn;
m_Info.dwSize = dwLen;
m_Info.dwType = REG_BINARY;
if(byData)
{
free(byData);
byData = NULL;
}
if(lReturn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::Write(LPCTSTR pszKey, const CRect& rect)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
BOOL bRes = FALSE;
try
{
CMemFile file;
{
CArchive ar (&file, CArchive::store);
ar << rect;
ar.Flush ();
}
DWORD dwDataSize = (DWORD) file.GetLength ();
LPBYTE lpbData = file.Detach ();
if (lpbData == NULL)
{
return FALSE;
}
bRes = Write (pszKey, lpbData, (UINT) dwDataSize);
free (lpbData);
}
catch (CMemoryException* pEx)
{
pEx->Delete ();
TRACE(_T("Memory exception in CRegistry::Write ()!\n"));
return FALSE;
}
return bRes;
}
BOOL CRegistry::Write(LPCTSTR pszKey, LPPOINT& lpPoint)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
ASSERT(m_hKey);
const int iMaxChars = 20;
CDWordArray dwcArray;
BYTE* byData = (BYTE*)::calloc(iMaxChars, sizeof(TCHAR));
ASSERT(byData);
dwcArray.SetSize(5);
dwcArray.SetAt(0, lpPoint->x);
dwcArray.SetAt(1, lpPoint->y);
CMemFile file(byData, iMaxChars, 16);
CArchive ar(&file, CArchive::store);
ASSERT(dwcArray.IsSerializable());
dwcArray.Serialize(ar);
ar.Close();
const DWORD dwLen = (DWORD) file.GetLength();
ASSERT(dwLen < iMaxChars);
LONG lReturn = RegSetValueEx(m_hKey, pszKey, 0, REG_BINARY,
file.Detach(), dwLen);
m_Info.lMessage = lReturn;
m_Info.dwSize = dwLen;
m_Info.dwType = REG_POINT;
if(byData)
{
free(byData);
byData = NULL;
}
if(lReturn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::Write (LPCTSTR pszKey, LPBYTE pData, UINT nBytes)
{
if (m_bReadOnly)
{
ASSERT (FALSE);
return FALSE;
}
ASSERT (m_hKey != NULL);
ASSERT (pszKey != NULL);
ASSERT (pData != NULL);
ASSERT (AfxIsValidAddress (pData, nBytes, FALSE));
LONG lResult = ::RegSetValueEx (m_hKey, pszKey, NULL, REG_BINARY,
pData, nBytes);
m_Info.lMessage = lResult;
m_Info.dwSize = nBytes;
m_Info.dwType = REG_BINARY;
return (lResult == ERROR_SUCCESS);
}
BOOL CRegistry::Read(LPCTSTR pszKey, int& iVal)
{
ASSERT(m_hKey);
DWORD dwType;
DWORD dwSize = sizeof (DWORD);
DWORD dwDest;
LONG lReturn = RegQueryValueEx (m_hKey, (LPTSTR) pszKey, NULL,
&dwType, (BYTE *) &dwDest, &dwSize);
m_Info.lMessage = lReturn;
m_Info.dwType = dwType;
m_Info.dwSize = dwSize;
if(lReturn == ERROR_SUCCESS)
{
iVal = (int)dwDest;
return TRUE;
}
return FALSE;
}
BOOL CRegistry::Read (LPCTSTR pszKey, DWORD& dwVal)
{
ASSERT(m_hKey);
DWORD dwType;
DWORD dwSize = sizeof (DWORD);
DWORD dwDest;
LONG lReturn = RegQueryValueEx (m_hKey, (LPTSTR) pszKey, NULL,
&dwType, (BYTE *) &dwDest, &dwSize);
m_Info.lMessage = lReturn;
m_Info.dwType = dwType;
m_Info.dwSize = dwSize;
if(lReturn == ERROR_SUCCESS)
{
dwVal = dwDest;
return TRUE;
}
return FALSE;
}
BOOL CRegistry::Read (LPCTSTR pszKey, CString& sVal)
{
ASSERT(m_hKey);
DWORD dwType;
DWORD dwSize = 200;
char szString[255];
LONG lReturn = RegQueryValueEx (m_hKey, (LPTSTR) pszKey, NULL,
&dwType, (BYTE *) szString, &dwSize);
m_Info.lMessage = lReturn;
m_Info.dwType = dwType;
m_Info.dwSize = dwSize;
if(lReturn == ERROR_SUCCESS)
{
sVal = szString;
return TRUE;
}
return FALSE;
}
BOOL CRegistry::Read (LPCTSTR pszKey, CStringList& scStringList)
{
ASSERT(m_hKey);
const int iMaxChars = 4096;
DWORD dwType;
DWORD dwData = iMaxChars;
BYTE* byData = (BYTE*)::calloc(iMaxChars, sizeof(TCHAR));
ASSERT(byData);
LONG lReturn = RegQueryValueEx(m_hKey, pszKey, NULL, &dwType,
byData, &dwData);
m_Info.lMessage = lReturn;
m_Info.dwType = dwType;
m_Info.dwSize = dwData;
if(lReturn == ERROR_SUCCESS && dwType == REG_BINARY)
{
ASSERT(dwData < iMaxChars);
CMemFile file(byData, dwData);
CArchive ar(&file, CArchive::load);
ar.m_bForceFlat = FALSE;
ASSERT(ar.IsLoading());
ASSERT(scStringList.IsSerializable());
scStringList.RemoveAll();
scStringList.Serialize(ar);
ar.Close();
file.Close();
}
if(byData)
{
free(byData);
byData = NULL;
}
if(lReturn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::Read (LPCTSTR pszKey, CByteArray& bcArray)
{
ASSERT(m_hKey);
const int iMaxChars = 4096;
int OldSize = (int) bcArray.GetSize();
DWORD dwType;
DWORD dwData = iMaxChars;
BYTE* byData = (BYTE*)::calloc(iMaxChars, sizeof(TCHAR));
ASSERT(byData);
LONG lReturn = RegQueryValueEx(m_hKey, pszKey, NULL, &dwType,
byData, &dwData);
m_Info.lMessage = lReturn;
m_Info.dwType = dwType;
m_Info.dwSize = dwData;
if(lReturn == ERROR_SUCCESS && dwType == REG_BINARY)
{
ASSERT(dwData < iMaxChars);
CMemFile file(byData, dwData);
CArchive ar(&file, CArchive::load);
ar.m_bForceFlat = FALSE;
ASSERT(ar.IsLoading());
ASSERT(bcArray.IsSerializable());
bcArray.RemoveAll();
bcArray.SetSize(10);
bcArray.Serialize(ar);
bcArray.SetSize(OldSize);
ar.Close();
file.Close();
}
if(byData)
{
free(byData);
byData = NULL;
}
if(lReturn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::Read (LPCTSTR pszKey, CDWordArray& dwcArray)
{
ASSERT(m_hKey);
const int iMaxChars = 4096;
DWORD dwType;
DWORD dwData = iMaxChars;
BYTE* byData = (BYTE*)::calloc(iMaxChars, sizeof(TCHAR));
ASSERT(byData);
LONG lReturn = RegQueryValueEx(m_hKey, pszKey, NULL, &dwType,
byData, &dwData);
m_Info.lMessage = lReturn;
m_Info.dwType = dwType;
m_Info.dwSize = dwData;
if(lReturn == ERROR_SUCCESS && dwType == REG_BINARY)
{
ASSERT(dwData < iMaxChars);
CMemFile file(byData, dwData);
CArchive ar(&file, CArchive::load);
ar.m_bForceFlat = FALSE;
ASSERT(ar.IsLoading());
ASSERT(dwcArray.IsSerializable());
dwcArray.RemoveAll();
dwcArray.SetSize(0);
dwcArray.Serialize(ar);
ar.Close();
file.Close();
}
if(byData)
{
free(byData);
byData = NULL;
}
if(lReturn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::Read (LPCTSTR pszKey, CWordArray& wcArray)
{
wcArray.SetSize (0);
BOOL bSucess = FALSE;
BYTE* pData = NULL;
UINT uDataSize;
if (!Read (pszKey, &pData, &uDataSize))
{
ASSERT (pData == NULL);
return FALSE;
}
ASSERT (pData != NULL);
try
{
CMemFile file (pData, uDataSize);
CArchive ar (&file, CArchive::load);
int iSize;
ar >> iSize;
wcArray.SetSize (iSize);
for (int i = 0; i < iSize; i ++)
{
ar >> wcArray [i];
}
bSucess = TRUE;
}
catch (CMemoryException* pEx)
{
pEx->Delete ();
TRACE(_T("Memory exception in CRegistry::Read ()!\n"));
}
catch (CArchiveException* pEx)
{
pEx->Delete ();
TRACE(_T("CArchiveException exception in CRegistry::Read ()!\n"));
}
delete pData;
return bSucess;
}
BOOL CRegistry::Read (LPCTSTR pszKey, CStringArray& scArray)
{
ASSERT(m_hKey);
const int iMaxChars = 4096;
int OldSize = (int) scArray.GetSize();
DWORD dwType;
DWORD dwData = iMaxChars;
BYTE* byData = (BYTE*)::calloc(iMaxChars, sizeof(TCHAR));
ASSERT(byData);
LONG lReturn = RegQueryValueEx(m_hKey, pszKey, NULL, &dwType,
byData, &dwData);
m_Info.lMessage = lReturn;
m_Info.dwType = dwType;
m_Info.dwSize = dwData;
if(lReturn == ERROR_SUCCESS && dwType == REG_BINARY)
{
ASSERT(dwData < iMaxChars);
CMemFile file(byData, dwData);
CArchive ar(&file, CArchive::load);
ar.m_bForceFlat = FALSE;
ASSERT(ar.IsLoading());
ASSERT(scArray.IsSerializable());
scArray.RemoveAll();
scArray.SetSize(10);
scArray.Serialize(ar);
scArray.SetSize(OldSize);
ar.Close();
file.Close();
}
if(byData)
{
free(byData);
byData = NULL;
}
if(lReturn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::Read(LPCTSTR pszKey, CRect& rect)
{
BOOL bSucess = FALSE;
BYTE* pData = NULL;
UINT uDataSize;
if (!Read (pszKey, &pData, &uDataSize))
{
ASSERT (pData == NULL);
return FALSE;
}
ASSERT (pData != NULL);
try
{
CMemFile file (pData, uDataSize);
CArchive ar (&file, CArchive::load);
ar >> rect;
bSucess = TRUE;
}
catch (CMemoryException* pEx)
{
pEx->Delete ();
TRACE(_T("Memory exception in CRegistry::Read ()!\n"));
}
catch (CArchiveException* pEx)
{
pEx->Delete ();
TRACE(_T("CArchiveException exception in CRegistry::Read ()!\n"));
}
delete pData;
return bSucess;
}
BOOL CRegistry::Read(LPCTSTR pszKey, LPPOINT& lpPoint)
{
ASSERT(m_hKey);
const int iMaxChars = 20;
CDWordArray dwcArray;
DWORD dwType;
DWORD dwData = iMaxChars;
BYTE* byData = (BYTE*)::calloc(iMaxChars, sizeof(TCHAR));
ASSERT(byData);
LONG lReturn = RegQueryValueEx(m_hKey, pszKey, NULL, &dwType,
byData, &dwData);
if(lReturn == ERROR_SUCCESS && dwType == REG_BINARY)
{
ASSERT(dwData < iMaxChars);
CMemFile file(byData, dwData);
CArchive ar(&file, CArchive::load);
ar.m_bForceFlat = FALSE;
ASSERT(ar.IsLoading());
ASSERT(dwcArray.IsSerializable());
dwcArray.RemoveAll();
dwcArray.SetSize(5);
dwcArray.Serialize(ar);
ar.Close();
file.Close();
lpPoint->x = dwcArray.GetAt(0);
lpPoint->y = dwcArray.GetAt(1);
}
m_Info.lMessage = lReturn;
m_Info.dwType = REG_POINT;
m_Info.dwSize = sizeof(POINT);
if(byData)
{
free(byData);
byData = NULL;
}
if(lReturn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::Read (LPCTSTR pszKey, BYTE** ppData, UINT* pBytes)
{
ASSERT (m_hKey != NULL);
ASSERT (pszKey != NULL);
ASSERT(ppData != NULL);
ASSERT(pBytes != NULL);
*ppData = NULL;
*pBytes = 0;
DWORD dwType, dwCount;
LONG lResult = ::RegQueryValueEx (m_hKey, pszKey, NULL, &dwType,
NULL, &dwCount);
if (lResult == ERROR_SUCCESS)
{
*pBytes = dwCount;
ASSERT (dwType == REG_BINARY);
*ppData = new BYTE [*pBytes];
lResult = ::RegQueryValueEx (m_hKey, pszKey, NULL, &dwType,
*ppData, &dwCount);
if (lResult == ERROR_SUCCESS)
{
ASSERT (dwType == REG_BINARY);
}
else
{
delete [] *ppData;
*ppData = NULL;
}
}
m_Info.lMessage = lResult;
m_Info.dwType = REG_BINARY;
m_Info.dwSize = *pBytes;
return (lResult == ERROR_SUCCESS);
}
BOOL CRegistry::Read (LPCTSTR pszKey, CObList& list)
{
BOOL bSucess = FALSE;
BYTE* pData = NULL;
UINT uDataSize;
while (!list.IsEmpty ())
{
delete list.RemoveHead ();
}
if (!Read (pszKey, &pData, &uDataSize))
{
ASSERT (pData == NULL);
return FALSE;
}
ASSERT (pData != NULL);
try
{
CMemFile file (pData, uDataSize);
CArchive ar (&file, CArchive::load);
list.Serialize (ar);
bSucess = TRUE;
}
catch (CMemoryException* pEx)
{
pEx->Delete ();
TRACE(_T("Memory exception in CRegistry::Read ()!\n"));
}
catch (CArchiveException* pEx)
{
pEx->Delete ();
TRACE(_T("CArchiveException exception in CRegistry::Read ()!\n"));
}
delete pData;
return bSucess;
}
BOOL CRegistry::Read (LPCTSTR pszKey, CObject& obj)
{
BOOL bSucess = FALSE;
BYTE* pData = NULL;
UINT uDataSize;
if (!Read (pszKey, &pData, &uDataSize))
{
ASSERT (pData == NULL);
return FALSE;
}
ASSERT (pData != NULL);
try
{
CMemFile file (pData, uDataSize);
CArchive ar (&file, CArchive::load);
obj.Serialize (ar);
bSucess = TRUE;
}
catch (CMemoryException* pEx)
{
pEx->Delete ();
TRACE(_T("Memory exception in CRegistry::Read ()!\n"));
}
catch (CArchiveException* pEx)
{
pEx->Delete ();
TRACE(_T("CArchiveException exception in CRegistry::Read ()!\n"));
}
delete pData;
return bSucess;
}
BOOL CRegistry::DeleteValue (LPCTSTR pszValue)
{
ASSERT(m_hKey);
LONG lReturn = RegDeleteValue(m_hKey, pszValue);
m_Info.lMessage = lReturn;
m_Info.dwType = 0L;
m_Info.dwSize = 0L;
if(lReturn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL CRegistry::DeleteKey (LPCTSTR pszPath, BOOL bAdmin)
{
ASSERT(pszPath);
CString strPath = pszPath;
int iPathLen = strPath.GetLength ();
if (iPathLen > 0 && strPath [iPathLen - 1] == _T('\\'))
{
strPath = strPath.Left (iPathLen - 1);
}
LONG lReturn = ::RegDeleteKey (bAdmin ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
strPath);
m_Info.lMessage = lReturn;
m_Info.dwType = 0L;
m_Info.dwSize = 0L;
if(lReturn == ERROR_SUCCESS)
return TRUE;
return FALSE;
}