You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1002 lines
22 KiB
C++

2 years ago
// XTRegistryManager.cpp : implementation file
//
// This file is a part of the XTREME CONTROLS MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Common/XTPVC80Helpers.h"
#include "XTPRegistryManager.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CHKey - helper automatically closes open HKEY
class CXTPRegistryManager::CHKey
{
public:
CHKey(HKEY hKey = NULL) : m_hKey(hKey)
{
}
~CHKey()
{
if (m_hKey != NULL)
{
::RegCloseKey(m_hKey);
}
}
HKEY& operator=(HKEY hKey)
{
if (m_hKey != NULL)
{
::RegCloseKey(m_hKey);
}
m_hKey = hKey;
return m_hKey;
}
BOOL operator==(HKEY hKey)
{
return m_hKey == hKey;
}
operator HKEY() const
{
return m_hKey;
}
operator PHKEY()
{
return &m_hKey;
}
private:
HKEY m_hKey;
};
/////////////////////////////////////////////////////////////////////////////
// CXTPRegistryManager
CString CXTPRegistryManager::m_strINIFileName = _T("");
CXTPRegistryManager::CXTPRegistryManager(HKEY hKeyBase/*= HKEY_CURRENT_USER*/)
{
ASSERT(hKeyBase == HKEY_CURRENT_USER || hKeyBase == HKEY_LOCAL_MACHINE);
m_hKeyBase = hKeyBase;
m_lResult = ERROR_SUCCESS;
}
CXTPRegistryManager::~CXTPRegistryManager()
{
}
void CXTPRegistryManager::SetRegistryKey(LPCTSTR lpszRegistryKey, LPCTSTR lpszProfileName)
{
m_strRegistryKey = lpszRegistryKey;
m_strProfileName = lpszProfileName;
}
BOOL CXTPRegistryManager::GetProfileInfo()
{
if (m_strRegistryKey.IsEmpty() || m_strProfileName.IsEmpty())
{
CWinApp* pWinApp = AfxGetApp();
if (pWinApp != NULL)
{
m_strRegistryKey = pWinApp->m_pszRegistryKey;
m_strProfileName = pWinApp->m_pszProfileName;
}
// If this fails, you need to call SetRegistryKey(...); in your
// applications CWinApp::InitInstance() override, or you have called
// this method before you call SetRegistryKey.. Calling SetRegistryKey
// will initialize m_pszProfileName and m_pszRegistryKey for CWinApp.
// NOTE: If you want to write to an INI file instead of the system
// registry, call CXTPRegistryManager::SetINIFileName(...) prior to
// making this call.
if (m_strRegistryKey.IsEmpty() || m_strProfileName.IsEmpty())
{
return FALSE;
}
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
HKEY CXTPRegistryManager::GetAppRegistryKey(REGSAM samDesired)
{
if (!GetProfileInfo())
return 0;
HKEY hAppKey = NULL;
CHKey hSoftKey;
CHKey hCompanyKey;
m_lResult = ::RegOpenKeyEx(m_hKeyBase, _T("Software"), 0,
samDesired, hSoftKey);
if (m_lResult != ERROR_SUCCESS)
return NULL;
DWORD dw = 0;
m_lResult = ::RegCreateKeyEx(hSoftKey, m_strRegistryKey, 0, REG_NONE,
REG_OPTION_NON_VOLATILE, samDesired, NULL, hCompanyKey, &dw);
if (m_lResult != ERROR_SUCCESS)
return NULL;
m_lResult = ::RegCreateKeyEx(hCompanyKey, m_strProfileName, 0, REG_NONE,
REG_OPTION_NON_VOLATILE, samDesired, NULL, &hAppKey, &dw);
if (m_lResult != ERROR_SUCCESS)
return NULL;
return hAppKey;
}
HKEY CXTPRegistryManager::GetFullPathKey(LPCTSTR lpszSection) const
{
if (_tcsncmp(lpszSection, _T("HKCU"), 4) == 0)
return HKEY_CURRENT_USER;
if (_tcsncmp(lpszSection, _T("HKLM"), 4) == 0)
return HKEY_LOCAL_MACHINE;
return 0;
}
HKEY CXTPRegistryManager::RecurseOpenKey(LPCTSTR lpszSection, REGSAM samDesired)
{
HKEY hKeyBase = GetFullPathKey(lpszSection);
if (hKeyBase == 0)
return 0;
CString strRegistryKey = lpszSection + 5;
CHKey hParentKey = NULL;
DWORD dw = 0;
int nIndex = strRegistryKey.Find('\\');
while (nIndex != -1)
{
CString strKey = strRegistryKey.Left(nIndex);
strRegistryKey = strRegistryKey.Mid(nIndex + 1);
HKEY hKey = 0;
m_lResult = ::RegCreateKeyEx(hParentKey == NULL ? hKeyBase : hParentKey, strKey, 0, REG_NONE,
REG_OPTION_NON_VOLATILE, samDesired, NULL, &hKey, &dw);
if (m_lResult != ERROR_SUCCESS)
return NULL;
hParentKey = hKey;
nIndex = strRegistryKey.Find('\\');
}
HKEY hAppKey = NULL;
m_lResult = ::RegCreateKeyEx(hParentKey, strRegistryKey, 0, REG_NONE,
REG_OPTION_NON_VOLATILE, samDesired, NULL, &hAppKey, &dw);
if (m_lResult != ERROR_SUCCESS)
return NULL;
return hAppKey;
}
HKEY CXTPRegistryManager::GetSectionKey(LPCTSTR lpszSection, REGSAM samDesired)
{
if (GetFullPathKey(lpszSection))
{
return RecurseOpenKey(lpszSection, samDesired);
}
if (!GetProfileInfo())
return 0;
ASSERT(lpszSection != NULL);
if (!lpszSection)
return 0;
HKEY hSectionKey = NULL;
CHKey hAppKey(GetAppRegistryKey(samDesired));
if (hAppKey == NULL)
return NULL;
DWORD dw = 0;
m_lResult = ::RegCreateKeyEx(hAppKey, lpszSection, 0, REG_NONE,
REG_OPTION_NON_VOLATILE, samDesired, NULL, &hSectionKey, &dw);
if (m_lResult != ERROR_SUCCESS)
return NULL;
return hSectionKey;
}
BOOL CXTPRegistryManager::WriteProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue)
{
ASSERT(lpszSection != NULL);
ASSERT(lpszEntry != NULL);
if (!lpszSection)
return 0;
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection));
if (hSecKey == NULL)
return FALSE;
m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL,
REG_DWORD, (LPBYTE)&nValue, sizeof(nValue));
if (m_lResult != ERROR_SUCCESS)
return FALSE;
return TRUE;
}
else
{
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
TCHAR szT[16];
wsprintf(szT, _T("%d"), nValue);
return ::WritePrivateProfileString(lpszSection, lpszEntry, szT,
m_strINIFileName);
}
}
BOOL CXTPRegistryManager::WriteProfileBinary(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE pData, UINT nBytes)
{
ASSERT(lpszSection != NULL);
ASSERT(lpszEntry != NULL);
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection));
if (hSecKey == NULL)
return FALSE;
m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_BINARY,
pData, nBytes);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
return TRUE;
}
// convert to string and write out
LPTSTR lpsz = new TCHAR[nBytes * 2 + 1];
UINT i;
for (i = 0; i < nBytes; i++)
{
lpsz[i * 2] = (TCHAR)((pData[i] & 0x0F) + 'A'); //low nibble
lpsz[i * 2 + 1] = (TCHAR)(((pData[i] >> 4) & 0x0F) + 'A'); //high nibble
}
lpsz[i * 2] = 0;
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
BOOL bResult = WriteProfileString(lpszSection, lpszEntry, lpsz);
delete[] lpsz;
return bResult;
}
BOOL CXTPRegistryManager::WriteProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue)
{
ASSERT(lpszSection != NULL);
if (!lpszSection)
return 0;
if (m_strINIFileName.IsEmpty())
{
if (lpszEntry == NULL) //delete whole section
{
CHKey hAppKey(GetAppRegistryKey(FALSE));
if (hAppKey == NULL)
return FALSE;
m_lResult = ::RegDeleteKey(hAppKey, lpszSection);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
}
else if (lpszValue == NULL)
{
CHKey hSecKey(GetSectionKey(lpszSection));
if (hSecKey == NULL)
return FALSE;
// necessary to cast away const below
m_lResult = ::RegDeleteValue(hSecKey, (LPTSTR)lpszEntry);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
}
else
{
CHKey hSecKey(GetSectionKey(lpszSection));
if (hSecKey == NULL)
return FALSE;
m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_SZ,
(LPBYTE)lpszValue, (lstrlen(lpszValue)+1)*sizeof(TCHAR));
if (m_lResult != ERROR_SUCCESS)
return FALSE;
}
return TRUE;
}
else
{
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
ASSERT(m_strINIFileName.GetLength() < 4095); // can't read in bigger
return ::WritePrivateProfileString(lpszSection, lpszEntry, lpszValue,
m_strINIFileName);
}
}
UINT CXTPRegistryManager::GetProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault)
{
ASSERT(lpszSection != NULL);
ASSERT(lpszEntry != NULL);
if (!lpszSection || !lpszEntry)
return 0;
if (m_strINIFileName.IsEmpty()) // use registry
{
CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
if (hSecKey == NULL)
return nDefault;
DWORD dwValue;
DWORD dwType;
DWORD dwCount = sizeof(DWORD);
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
(LPBYTE)&dwValue, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return nDefault;
ASSERT(dwType == REG_DWORD);
ASSERT(dwCount == sizeof(dwValue));
return (UINT)dwValue;
}
else
{
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
return ::GetPrivateProfileInt(lpszSection, lpszEntry, nDefault,
m_strINIFileName);
}
}
BOOL CXTPRegistryManager::GetProfileBinary(LPCTSTR lpszSection, LPCTSTR lpszEntry, BYTE** ppData, UINT* pBytes)
{
ASSERT(lpszSection != NULL);
ASSERT(lpszEntry != NULL);
ASSERT(ppData != NULL);
ASSERT(pBytes != NULL);
if (!ppData || !pBytes)
return FALSE;
*ppData = NULL;
*pBytes = 0;
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
if (hSecKey == NULL)
return FALSE;
DWORD dwType, dwCount;
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
NULL, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
*pBytes = dwCount;
*ppData = new BYTE[*pBytes];
ASSERT(dwType == REG_BINARY);
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
*ppData, &dwCount);
if (m_lResult != ERROR_SUCCESS)
{
SAFE_DELETE_AR(*ppData);
return FALSE;
}
ASSERT(dwType == REG_BINARY);
return TRUE;
}
else
{
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
CString str = GetProfileString(lpszSection, lpszEntry, NULL);
if (str.IsEmpty())
return FALSE;
ASSERT(str.GetLength()%2 == 0);
int nLen = str.GetLength();
*pBytes = nLen/2;
*ppData = new BYTE[*pBytes];
int i;
for (i = 0; i < nLen; i += 2)
{
(*ppData)[i/2] = (BYTE)
(((str[i + 1] - 'A') << 4) + (str[i] - 'A'));
}
return TRUE;
}
}
CString CXTPRegistryManager::GetProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault)
{
ASSERT(lpszSection != NULL);
ASSERT(lpszEntry != NULL);
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
if (hSecKey == NULL)
return lpszDefault;
CString strValue;
DWORD dwType, dwCount;
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
NULL, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return lpszDefault;
ASSERT(dwType == REG_SZ);
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
(LPBYTE)strValue.GetBuffer(dwCount/sizeof(TCHAR)), &dwCount);
strValue.ReleaseBuffer();
if (m_lResult != ERROR_SUCCESS)
return lpszDefault;
ASSERT(dwType == REG_SZ);
return strValue;
}
else
{
TCHAR chNil = '\0';
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
if (lpszDefault == NULL)
{
lpszDefault = &chNil; // don't pass in NULL
}
TCHAR szT[4096];
DWORD dw = ::GetPrivateProfileString(lpszSection, lpszEntry,
lpszDefault, szT, _countof(szT), m_strINIFileName);
ASSERT(dw < 4095);
return szT;
}
}
int CXTPRegistryManager::EnumValues(LPCTSTR lpszSection, CMap<CString, LPCTSTR, DWORD, DWORD&>* mapItems,
CStringArray * arrayNames)
{
ASSERT(lpszSection != NULL);
CHKey hKey(GetSectionKey(lpszSection, KEY_READ));
if (hKey == NULL)
return 0;
int index = 0;
TCHAR szValue[512];
DWORD dwLen = 512;
DWORD dwType;
while (::RegEnumValue(hKey, index++, szValue, &dwLen,
NULL, &dwType, NULL, NULL) == ERROR_SUCCESS)
{
if (mapItems) mapItems->SetAt(szValue, dwType);
if (arrayNames) arrayNames->Add(szValue);
dwLen = 512;
}
return --index;
}
int CXTPRegistryManager::EnumKeys(LPCTSTR lpszSection, CStringArray & arrayKeys)
{
ASSERT(lpszSection != NULL);
CHKey hKey(GetSectionKey(lpszSection, KEY_READ));
if (hKey == NULL)
return 0;
int index = 0;
TCHAR szValue[512];
DWORD dwLen = 512;
while (::RegEnumKeyEx(hKey, index++, szValue, &dwLen,
NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
arrayKeys.Add(szValue);
dwLen = 512;
}
return --index;
}
LONG CXTPRegistryManager::RecurseDeleteKey(HKEY hKey, LPCTSTR lpszKey)
{
CHKey hSubKey;
LONG lRes = ::RegOpenKeyEx(hKey, lpszKey, 0, KEY_READ | KEY_WRITE, hSubKey);
if (lRes != ERROR_SUCCESS)
return lRes;
FILETIME time;
DWORD dwSize = 256;
TCHAR szBuffer[256];
while (::RegEnumKeyEx(hSubKey, 0, szBuffer, &dwSize, NULL, NULL, NULL,
&time) == ERROR_SUCCESS)
{
lRes = RecurseDeleteKey(hSubKey, szBuffer);
if (lRes != ERROR_SUCCESS)
return lRes;
dwSize = 256;
}
m_lResult = ::RegDeleteKey(hKey, lpszKey);
return m_lResult;
}
bool CXTPRegistryManager::DeleteKey(LPCTSTR lpszSection, LPCTSTR lpszKey)
{
CHKey hSectionKey(GetSectionKey(lpszSection));
if (hSectionKey == NULL)
return false;
return (RecurseDeleteKey(hSectionKey, lpszKey) == ERROR_SUCCESS);
}
bool CXTPRegistryManager::DeleteValue(LPCTSTR lpszSection, LPCTSTR lpszValue)
{
CHKey hSecKey(GetSectionKey(lpszSection, KEY_ALL_ACCESS));
if (hSecKey == NULL)
return false;
m_lResult = ::RegDeleteValue(hSecKey, (LPTSTR)lpszValue);
return (m_lResult == ERROR_SUCCESS);
}
BOOL CXTPRegistryManager::WriteProfilePoint(LPCTSTR lpszSection, LPCTSTR lpszEntry, CPoint* pValue)
{
ASSERT(lpszSection != NULL);
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection));
if (hSecKey == NULL)
return FALSE;
m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_BINARY,
(LPBYTE)pValue, sizeof(CPoint));
if (m_lResult != ERROR_SUCCESS)
return FALSE;
return TRUE;
}
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
CString str;
str.Format(_T("%i,%i"), pValue->x, pValue->y);
BOOL bResult = WriteProfileString(lpszSection, lpszEntry, str);
return bResult;
}
BOOL CXTPRegistryManager::GetProfilePoint(LPCTSTR lpszSection, LPCTSTR lpszEntry, CPoint* ptResult)
{
ASSERT(lpszSection != NULL);
ASSERT(lpszEntry != NULL);
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
if (hSecKey == NULL)
return FALSE;
DWORD dwType, dwCount;
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
NULL, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
ASSERT(dwType == REG_BINARY);
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
(LPBYTE)ptResult, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
ASSERT(dwType == REG_BINARY);
return TRUE;
}
else
{
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
CString str = GetProfileString(lpszSection, lpszEntry, NULL);
if (str.IsEmpty())
return FALSE;
SCANF_S(str, _T("%ld,%ld"), &ptResult->x, &ptResult->y);
return TRUE;
}
}
BOOL CXTPRegistryManager::WriteProfileRect(LPCTSTR lpszSection, LPCTSTR lpszEntry, CRect* pValue)
{
ASSERT(lpszSection != NULL);
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection));
if (hSecKey == NULL)
return FALSE;
m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_BINARY,
(LPBYTE)pValue, sizeof(CRect));
if (m_lResult != ERROR_SUCCESS)
return FALSE;
return TRUE;
}
CString str;
str.Format(_T("%i,%i,%i,%i"), pValue->left, pValue->top, pValue->right, pValue->bottom);
BOOL bResult = WriteProfileString(lpszSection, lpszEntry, str);
return bResult;
}
BOOL CXTPRegistryManager::GetProfileRect(LPCTSTR lpszSection, LPCTSTR lpszEntry, CRect* rcResult)
{
ASSERT(lpszSection != NULL);
ASSERT(lpszEntry != NULL);
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
if (hSecKey == NULL)
return FALSE;
DWORD dwType, dwCount;
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
NULL, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
ASSERT(dwType == REG_BINARY);
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
(LPBYTE)rcResult, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
return TRUE;
}
else
{
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
// convert to string and write out
CString str = GetProfileString(lpszSection, lpszEntry, NULL);
if (str.IsEmpty())
return FALSE;
SCANF_S(str, _T("%ld,%ld,%ld,%ld"), &rcResult->left, &rcResult->top, &rcResult->right, &rcResult->bottom);
return TRUE;
}
}
BOOL CXTPRegistryManager::WriteProfileSize(LPCTSTR lpszSection, LPCTSTR lpszEntry, CSize* pValue)
{
ASSERT(lpszSection != NULL);
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection));
if (hSecKey == NULL)
return FALSE;
m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_BINARY,
(LPBYTE)pValue, sizeof(CSize));
if (m_lResult != ERROR_SUCCESS)
return FALSE;
return TRUE;
}
CString str;
str.Format(_T("%i,%i"), pValue->cx, pValue->cy);
BOOL bResult = WriteProfileString(lpszSection, lpszEntry, str);
return bResult;
}
BOOL CXTPRegistryManager::GetProfileSize(LPCTSTR lpszSection, LPCTSTR lpszEntry, CSize* szResult)
{
ASSERT(lpszSection != NULL);
ASSERT(lpszEntry != NULL);
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
if (hSecKey == NULL)
return FALSE;
DWORD dwType, dwCount;
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
NULL, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
ASSERT(dwType == REG_BINARY);
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
(LPBYTE)szResult, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
ASSERT(dwType == REG_BINARY);
return TRUE;
}
else
{
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
// convert to string and write out
CString str = GetProfileString(lpszSection, lpszEntry, NULL);
if (str.IsEmpty())
return FALSE;
SCANF_S(str, _T("%i,%i"), &szResult->cx, &szResult->cy);
return TRUE;
}
}
BOOL CXTPRegistryManager::WriteProfileDouble(LPCTSTR lpszSection, LPCTSTR lpszEntry, double* pValue)
{
ASSERT(lpszSection != NULL);
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection));
if (hSecKey == NULL)
return FALSE;
m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_BINARY,
(LPBYTE)pValue, sizeof(*pValue));
if (m_lResult != ERROR_SUCCESS)
return FALSE;
return TRUE;
}
LPBYTE pData = (LPBYTE) pValue;
UINT nBytes = sizeof(double);
LPTSTR lpsz = new TCHAR[nBytes * 2 + 1];
UINT i;
for (i = 0; i < nBytes; i++)
{
lpsz[i * 2] = (TCHAR)((pData[i] & 0x0F) + 'A'); //low nibble
lpsz[i * 2 + 1] = (TCHAR)(((pData[i] >> 4) & 0x0F) + 'A'); //high nibble
}
lpsz[i * 2] = 0;
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
BOOL bResult = WriteProfileString(lpszSection, lpszEntry, lpsz);
delete[] lpsz;
return bResult;
}
BOOL CXTPRegistryManager::GetProfileDouble(LPCTSTR lpszSection, LPCTSTR lpszEntry, double* dResult)
{
ASSERT(lpszSection != NULL);
ASSERT(lpszEntry != NULL);
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
if (hSecKey == NULL)
return FALSE;
DWORD dwType, dwCount;
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
NULL, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
ASSERT(dwType == REG_BINARY);
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
(LPBYTE)dResult, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
ASSERT(dwType == REG_BINARY);
return TRUE;
}
else
{
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
CString str = GetProfileString(lpszSection, lpszEntry, NULL);
if (str.IsEmpty())
return FALSE;
ASSERT(str.GetLength()%2 == 0);
int nLen = str.GetLength();
LPBYTE pData = (LPBYTE) dResult;
int i;
for (i = 0; i < nLen; i += 2)
{
(pData)[i/2] = (BYTE)
(((str[i + 1] - 'A') << 4) + (str[i] - 'A'));
}
return TRUE;
}
}
BOOL CXTPRegistryManager::WriteProfileDword(LPCTSTR lpszSection, LPCTSTR lpszEntry, DWORD* pValue)
{
ASSERT(lpszSection != NULL);
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection));
if (hSecKey == NULL)
return FALSE;
m_lResult = ::RegSetValueEx(hSecKey, lpszEntry, NULL, REG_DWORD,
(LPBYTE)pValue, sizeof(*pValue));
if (m_lResult != ERROR_SUCCESS)
return FALSE;
return TRUE;
}
BOOL bResult = WriteProfileInt(lpszSection, lpszEntry, int(*pValue));
return bResult;
}
BOOL CXTPRegistryManager::GetProfileDword(LPCTSTR lpszSection, LPCTSTR lpszEntry, DWORD* dwResult)
{
ASSERT(lpszSection != NULL);
ASSERT(lpszEntry != NULL);
if (m_strINIFileName.IsEmpty())
{
CHKey hSecKey(GetSectionKey(lpszSection, KEY_READ));
if (hSecKey == NULL)
return FALSE;
DWORD dwType, dwCount;
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
NULL, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
ASSERT(dwType == REG_DWORD);
m_lResult = ::RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
(LPBYTE)dwResult, &dwCount);
if (m_lResult != ERROR_SUCCESS)
return FALSE;
ASSERT(dwType == REG_DWORD);
return TRUE;
}
else
{
ASSERT(m_strINIFileName.IsEmpty() == FALSE);
CString str = GetProfileString(lpszSection, lpszEntry, NULL);
if (str.IsEmpty())
return FALSE;
*dwResult = (DWORD)GetProfileInt(lpszSection, lpszEntry, 0);
return TRUE;
}
}
BOOL CXTPRegistryManager::WriteProfileColor(LPCTSTR lpszSection, LPCTSTR lpszEntry, COLORREF* pValue)
{
return WriteProfileDword(lpszSection, lpszEntry, pValue);
}
BOOL CXTPRegistryManager::GetProfileColor(LPCTSTR lpszSection, LPCTSTR lpszEntry, COLORREF* rgbResult)
{
return GetProfileDword(lpszSection, lpszEntry, rgbResult);
}
CString CXTPRegistryManager::GetErrorMessage() const
{
LPVOID lpMsgBuf = 0;
::FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetErrorCode(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
CString csMessage((LPCTSTR)lpMsgBuf);
// Free the buffer.
::LocalFree( lpMsgBuf );
return csMessage;
}