www.pudn.com > TVToolbar_demo > Registry.cpp


// Registry.cpp : implementation file 
// 
 
 
#include "stdafx.h" 
#include "Registry.h" 
 
#include  
#pragma  comment( lib , "advapi32") 
 
CRegistry::CRegistry(HKEY hKeyRoot) 
{ 
	m_hKey = hKeyRoot; 
} 
 
CRegistry::~CRegistry() 
{ 
	Close(); 
} 
 
 
BOOL CRegistry::VerifyKey (HKEY hKeyRoot, LPCTSTR pszPath) 
{ 
	ASSERT (hKeyRoot); 
	ASSERT (pszPath); 
 
	LONG ReturnValue = RegOpenKeyEx (hKeyRoot, pszPath, 0L, 
		KEY_ALL_ACCESS, &m_hKey); 
	if(ReturnValue == ERROR_SUCCESS) 
		return TRUE; 
	 
	m_Info.lMessage = ReturnValue; 
	m_Info.dwSize = 0L; 
	m_Info.dwType = 0L; 
 
	return FALSE; 
} 
 
BOOL CRegistry::VerifyKey (LPCTSTR pszPath) 
{ 
	ASSERT (m_hKey); 
 
	LONG ReturnValue = RegOpenKeyEx (m_hKey, pszPath, 0L, 
		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 (HKEY hKeyRoot, LPCTSTR pszPath) 
{ 
	DWORD dw; 
 
	LONG ReturnValue = RegCreateKeyEx (hKeyRoot, pszPath, 0L, NULL, 
		REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL,  
		&m_hKey, &dw); 
 
	m_Info.lMessage = ReturnValue; 
	m_Info.dwSize = 0L; 
	m_Info.dwType = 0L; 
 
	if(ReturnValue == ERROR_SUCCESS) 
		return TRUE; 
 
	return FALSE; 
} 
 
BOOL CRegistry::Open (HKEY hKeyRoot, LPCTSTR pszPath) 
{ 
	m_sPath = pszPath; 
 
	LONG ReturnValue = RegOpenKeyEx (hKeyRoot, pszPath, 0L, 
		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; 
} 
 
void CRegistry::Close() 
{ 
	if (m_hKey) 
	{ 
		RegCloseKey (m_hKey); 
		m_hKey = NULL; 
	} 
} 
 
BOOL CRegistry::Write (LPCTSTR pszKey, int iVal) 
{ 
	DWORD dwValue; 
 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	 
	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) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	return RegSetValueEx (m_hKey, pszKey, 0L, REG_DWORD, 
		(CONST BYTE*) &dwVal, sizeof(DWORD)); 
} 
 
BOOL CRegistry::Write (LPCTSTR pszKey, LPCTSTR pszData) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	ASSERT(pszData); 
	ASSERT(AfxIsValidAddress(pszData, strlen(pszData), FALSE)); 
 
	LONG ReturnValue = RegSetValueEx (m_hKey, pszKey, 0L, REG_SZ, 
		(CONST BYTE*) pszData, strlen(pszData) + 1); 
 
	m_Info.lMessage = ReturnValue; 
	m_Info.dwSize = strlen(pszData) + 1; 
	m_Info.dwType = REG_SZ; 
 
	if(ReturnValue == ERROR_SUCCESS) 
		return TRUE; 
	 
	return FALSE; 
} 
 
BOOL CRegistry::Write (LPCTSTR pszKey, CStringList& scStringList) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	const int iMaxChars = 4096; 
	DWORD dwData = iMaxChars; 
	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(); 
	const DWORD dwLen = 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, CByteArray& bcArray) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	const int iMaxChars = 4096; 
	DWORD dwData = iMaxChars; 
	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 = 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); 
	ASSERT(pszKey); 
	const int iMaxChars = 4096; 
	DWORD dwData = iMaxChars; 
	BYTE* byData = (BYTE*)::calloc(iMaxChars, sizeof(TCHAR)); 
	ASSERT(byData); 
 
	CMemFile file(byData, iMaxChars, 16); 
	CArchive ar(&file, CArchive::store); 
	ASSERT(dwcArray.IsSerializable()); 
	dwcArray.Serialize(ar); 
	ar.Close(); 
	const DWORD dwLen = 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, CWordArray& wcArray) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	const int iMaxChars = 4096; 
	DWORD dwData = iMaxChars; 
	BYTE* byData = (BYTE*)::calloc(iMaxChars, sizeof(TCHAR)); 
	ASSERT(byData); 
 
	CMemFile file(byData, iMaxChars, 16); 
	CArchive ar(&file, CArchive::store); 
	ASSERT(wcArray.IsSerializable()); 
	wcArray.Serialize(ar); 
	ar.Close(); 
	const DWORD dwLen = 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, CStringArray& scArray) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	const int iMaxChars = 4096; 
	DWORD dwData = iMaxChars; 
	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 = 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, LPCRECT rcRect) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	const int iMaxChars = 30; 
	CDWordArray dwcArray; 
	DWORD dwData = iMaxChars; 
	BYTE* byData = (BYTE*)::calloc(iMaxChars, sizeof(TCHAR)); 
	ASSERT(byData); 
 
	dwcArray.SetSize(5); 
	dwcArray.SetAt(0, rcRect->top); 
	dwcArray.SetAt(1, rcRect->bottom); 
	dwcArray.SetAt(2, rcRect->left); 
	dwcArray.SetAt(3, rcRect->right); 
 
	CMemFile file(byData, iMaxChars, 16); 
	CArchive ar(&file, CArchive::store); 
	ASSERT(dwcArray.IsSerializable()); 
	dwcArray.Serialize(ar); 
	ar.Close(); 
	const DWORD dwLen = 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_RECT; 
 
	if(byData) 
	{ 
		free(byData); 
		byData = NULL; 
	} 
 
	if(lReturn == ERROR_SUCCESS) 
		return TRUE; 
	 
	return FALSE; 
} 
 
BOOL CRegistry::Write(LPCTSTR pszKey, LPPOINT& lpPoint) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	const int iMaxChars = 20; 
	CDWordArray dwcArray; 
	DWORD dwData = iMaxChars; 
	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 = 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::Read(LPCTSTR pszKey, int& iVal) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
 
	DWORD dwType; 
	DWORD dwSize = sizeof (DWORD); 
	DWORD dwDest; 
 
	LONG lReturn = RegQueryValueEx (m_hKey, (LPSTR) 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); 
	ASSERT(pszKey); 
 
	DWORD dwType; 
	DWORD dwSize = sizeof (DWORD); 
	DWORD dwDest; 
 
	LONG lReturn = RegQueryValueEx (m_hKey, (LPSTR) 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); 
	ASSERT(pszKey); 
 
	DWORD dwType; 
	DWORD dwSize = 200; 
	char  szString[255]; 
 
	LONG lReturn = RegQueryValueEx (m_hKey, (LPSTR) 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); 
	ASSERT(pszKey); 
	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); 
	ASSERT(pszKey); 
	const int iMaxChars = 4096; 
	int OldSize = 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); 
	ASSERT(pszKey); 
	const int iMaxChars = 4096; 
	int OldSize = dwcArray.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(dwcArray.IsSerializable()); 
		dwcArray.RemoveAll(); 
		dwcArray.SetSize(10); 
		dwcArray.Serialize(ar); 
		dwcArray.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, CWordArray& wcArray) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	const int iMaxChars = 4096; 
	int OldSize = wcArray.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(wcArray.IsSerializable()); 
		wcArray.RemoveAll(); 
		wcArray.SetSize(10); 
		wcArray.Serialize(ar); 
		wcArray.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, CStringArray& scArray) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	const int iMaxChars = 4096; 
	int OldSize = 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, LPRECT& rcRect) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	const int iMaxChars = 30; 
	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(); 
		rcRect->top = dwcArray.GetAt(0); 
		rcRect->bottom = dwcArray.GetAt(1); 
		rcRect->left = dwcArray.GetAt(2); 
		rcRect->right = dwcArray.GetAt(3); 
	} 
 
	m_Info.lMessage = lReturn; 
	m_Info.dwType = REG_RECT; 
	m_Info.dwSize = sizeof(RECT); 
 
	if(byData) 
	{ 
		free(byData); 
		byData = NULL; 
	} 
 
	if(lReturn == ERROR_SUCCESS) 
		return TRUE; 
 
	return FALSE; 
} 
 
BOOL CRegistry::Read(LPCTSTR pszKey, LPPOINT& lpPoint) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	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::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::DeleteValueKey (HKEY hKeyRoot, LPCTSTR pszPath) 
{ 
	ASSERT(pszPath); 
	ASSERT(hKeyRoot); 
 
	LONG lReturn = RegDeleteKey(hKeyRoot, pszPath); 
 
	m_Info.lMessage = lReturn; 
	m_Info.dwType = 0L; 
	m_Info.dwSize = 0L; 
 
	if(lReturn == ERROR_SUCCESS) 
		return TRUE; 
 
	return FALSE; 
} 
 
// for debugging 
void ShowSysMsg(LONG res, char* str, char* file, DWORD line) 
{ 
	char msg[256]; 
	LPVOID lpMsgBuf; 
	FormatMessage(		FORMAT_MESSAGE_ALLOCATE_BUFFER |  
						FORMAT_MESSAGE_FROM_SYSTEM |	  
						FORMAT_MESSAGE_IGNORE_INSERTS, 
						NULL,	  
						res,	 
						MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language     
						(LPTSTR) &lpMsgBuf,     
						0,     
						NULL ); 
	sprintf(msg, "%u %s\n%s %u", res, str, file, line); 
	MessageBox( NULL, msg, (char*)lpMsgBuf, MB_OK | MB_ICONINFORMATION ); 
	LocalFree( lpMsgBuf );  
} 
 
BOOL CRegistry::ListKey (LPCTSTR pszKey, CStringArray& scArray) 
{ 
	ASSERT(m_hKey); 
	ASSERT(pszKey); 
	DWORD	dwSubKeys; 
	DWORD	idw; 
	LONG	lReturn; 
	HKEY	hQKey  = NULL; 
	CString szSubKeyName; 
	TCHAR	szStr[200]; 
	DWORD	dwSubKeyNameLen; 
	FILETIME	LastFileTime; 
	BOOL	Ok; 
 
	lReturn = RegOpenKeyEx (m_hKey, pszKey, 0L, 
		KEY_ALL_ACCESS, &hQKey); 
 
	Ok = (lReturn == ERROR_SUCCESS); 
 
	m_Info.lMessage = lReturn; 
	m_Info.dwSize = 0L; 
	m_Info.dwType = 0L; 
 
	if (Ok) { 
 
		lReturn = RegQueryInfoKey( hQKey, NULL, NULL, NULL 
			, &dwSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL ); 
		 
		m_Info.lMessage = lReturn; 
		m_Info.dwType = 0; 
		m_Info.dwSize = 0; 
		 
		Ok = (lReturn == ERROR_SUCCESS); 
	} 
	if (Ok) { 
		scArray.RemoveAll(); 
	} 
	for ( idw=0; ((idw