home *** CD-ROM | disk | FTP | other *** search
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
-
- #include "stdafx.h"
-
- #ifdef AFX_INIT_SEG
- #pragma code_seg(AFX_INIT_SEG)
- #endif
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CWinApp Settings Helpers
-
- #ifdef AFX_INIT_SEG
- #pragma code_seg(AFX_INIT_SEG)
- #endif
-
- void CWinApp::SetRegistryKey(LPCTSTR lpszRegistryKey)
- {
- ASSERT(m_pszRegistryKey == NULL);
- ASSERT(lpszRegistryKey != NULL);
- ASSERT(m_pszAppName != NULL);
-
- BOOL bEnable = AfxEnableMemoryTracking(FALSE);
- free((void*)m_pszRegistryKey);
- m_pszRegistryKey = _tcsdup(lpszRegistryKey);
- free((void*)m_pszProfileName);
- m_pszProfileName = _tcsdup(m_pszAppName);
- AfxEnableMemoryTracking(bEnable);
- }
-
- void CWinApp::SetRegistryKey(UINT nIDRegistryKey)
- {
- ASSERT(m_pszRegistryKey == NULL);
-
- TCHAR szRegistryKey[256];
- VERIFY(AfxLoadString(nIDRegistryKey, szRegistryKey));
- SetRegistryKey(szRegistryKey);
- }
-
- // returns key for HKEY_CURRENT_USER\"Software"\RegistryKey\ProfileName
- // creating it if it doesn't exist
- // responsibility of the caller to call RegCloseKey() on the returned HKEY
- HKEY CWinApp::GetAppRegistryKey()
- {
- ASSERT(m_pszRegistryKey != NULL);
- ASSERT(m_pszProfileName != NULL);
-
- HKEY hAppKey = NULL;
- HKEY hSoftKey = NULL;
- HKEY hCompanyKey = NULL;
- if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("software"), 0, KEY_WRITE|KEY_READ,
- &hSoftKey) == ERROR_SUCCESS)
- {
- DWORD dw;
- if (RegCreateKeyEx(hSoftKey, m_pszRegistryKey, 0, REG_NONE,
- REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
- &hCompanyKey, &dw) == ERROR_SUCCESS)
- {
- RegCreateKeyEx(hCompanyKey, m_pszProfileName, 0, REG_NONE,
- REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
- &hAppKey, &dw);
- }
- }
- if (hSoftKey != NULL)
- RegCloseKey(hSoftKey);
- if (hCompanyKey != NULL)
- RegCloseKey(hCompanyKey);
-
- return hAppKey;
- }
-
- // returns key for:
- // HKEY_CURRENT_USER\"Software"\RegistryKey\AppName\lpszSection
- // creating it if it doesn't exist.
- // responsibility of the caller to call RegCloseKey() on the returned HKEY
- HKEY CWinApp::GetSectionKey(LPCTSTR lpszSection)
- {
- ASSERT(lpszSection != NULL);
-
- HKEY hSectionKey = NULL;
- HKEY hAppKey = GetAppRegistryKey();
- if (hAppKey == NULL)
- return NULL;
-
- DWORD dw;
- RegCreateKeyEx(hAppKey, lpszSection, 0, REG_NONE,
- REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,
- &hSectionKey, &dw);
- RegCloseKey(hAppKey);
- return hSectionKey;
- }
-
- UINT CWinApp::GetProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry,
- int nDefault)
- {
- ASSERT(lpszSection != NULL);
- ASSERT(lpszEntry != NULL);
- if (m_pszRegistryKey != NULL) // use registry
- {
- HKEY hSecKey = GetSectionKey(lpszSection);
- if (hSecKey == NULL)
- return nDefault;
- DWORD dwValue;
- DWORD dwType;
- DWORD dwCount = sizeof(DWORD);
- LONG lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
- (LPBYTE)&dwValue, &dwCount);
- RegCloseKey(hSecKey);
- if (lResult == ERROR_SUCCESS)
- {
- ASSERT(dwType == REG_DWORD);
- ASSERT(dwCount == sizeof(dwValue));
- return (UINT)dwValue;
- }
- return nDefault;
- }
- else
- {
- ASSERT(m_pszProfileName != NULL);
- return ::GetPrivateProfileInt(lpszSection, lpszEntry, nDefault,
- m_pszProfileName);
- }
- }
-
- CString CWinApp::GetProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry,
- LPCTSTR lpszDefault)
- {
- ASSERT(lpszSection != NULL);
- ASSERT(lpszEntry != NULL);
- if (m_pszRegistryKey != NULL)
- {
- HKEY hSecKey = GetSectionKey(lpszSection);
- if (hSecKey == NULL)
- return lpszDefault;
- CString strValue;
- DWORD dwType, dwCount;
- LONG lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
- NULL, &dwCount);
- if (lResult == ERROR_SUCCESS)
- {
- ASSERT(dwType == REG_SZ);
- lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
- (LPBYTE)strValue.GetBuffer(dwCount/sizeof(TCHAR)), &dwCount);
- strValue.ReleaseBuffer();
- }
- RegCloseKey(hSecKey);
- if (lResult == ERROR_SUCCESS)
- {
- ASSERT(dwType == REG_SZ);
- return strValue;
- }
- return lpszDefault;
- }
- else
- {
- ASSERT(m_pszProfileName != NULL);
-
- if (lpszDefault == NULL)
- lpszDefault = &afxChNil; // don't pass in NULL
- TCHAR szT[4096];
- DWORD dw = ::GetPrivateProfileString(lpszSection, lpszEntry,
- lpszDefault, szT, _countof(szT), m_pszProfileName);
- ASSERT(dw < 4095);
- return szT;
- }
- }
-
- BOOL CWinApp::GetProfileBinary(LPCTSTR lpszSection, LPCTSTR lpszEntry,
- BYTE** ppData, UINT* pBytes)
- {
- ASSERT(lpszSection != NULL);
- ASSERT(lpszEntry != NULL);
- ASSERT(ppData != NULL);
- ASSERT(pBytes != NULL);
- *ppData = NULL;
- *pBytes = 0;
- if (m_pszRegistryKey != NULL)
- {
- HKEY hSecKey = GetSectionKey(lpszSection);
- if (hSecKey == NULL)
- return FALSE;
-
- DWORD dwType, dwCount;
- LONG lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
- NULL, &dwCount);
- *pBytes = dwCount;
- if (lResult == ERROR_SUCCESS)
- {
- ASSERT(dwType == REG_BINARY);
- *ppData = new BYTE[*pBytes];
- lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,
- *ppData, &dwCount);
- }
- RegCloseKey(hSecKey);
- if (lResult == ERROR_SUCCESS)
- {
- ASSERT(dwType == REG_BINARY);
- return TRUE;
- }
- else
- {
- delete [] *ppData;
- *ppData = NULL;
- }
- return FALSE;
- }
- else
- {
- ASSERT(m_pszProfileName != NULL);
-
- 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];
- for (int i=0;i<nLen;i+=2)
- {
- (*ppData)[i/2] = (BYTE)
- (((str[i+1] - 'A') << 4) + (str[i] - 'A'));
- }
- return TRUE;
- }
- }
-
- #ifdef AFX_CORE3_SEG
- #pragma code_seg(AFX_CORE3_SEG)
- #endif
-
- BOOL CWinApp::WriteProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry,
- int nValue)
- {
- ASSERT(lpszSection != NULL);
- ASSERT(lpszEntry != NULL);
- if (m_pszRegistryKey != NULL)
- {
- HKEY hSecKey = GetSectionKey(lpszSection);
- if (hSecKey == NULL)
- return FALSE;
- LONG lResult = RegSetValueEx(hSecKey, lpszEntry, NULL, REG_DWORD,
- (LPBYTE)&nValue, sizeof(nValue));
- RegCloseKey(hSecKey);
- return lResult == ERROR_SUCCESS;
- }
- else
- {
- ASSERT(m_pszProfileName != NULL);
-
- TCHAR szT[16];
- wsprintf(szT, _T("%d"), nValue);
- return ::WritePrivateProfileString(lpszSection, lpszEntry, szT,
- m_pszProfileName);
- }
- }
-
- BOOL CWinApp::WriteProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry,
- LPCTSTR lpszValue)
- {
- ASSERT(lpszSection != NULL);
- if (m_pszRegistryKey != NULL)
- {
- LONG lResult;
- if (lpszEntry == NULL) //delete whole section
- {
- HKEY hAppKey = GetAppRegistryKey();
- if (hAppKey == NULL)
- return FALSE;
- lResult = ::RegDeleteKey(hAppKey, lpszSection);
- RegCloseKey(hAppKey);
- }
- else if (lpszValue == NULL)
- {
- HKEY hSecKey = GetSectionKey(lpszSection);
- if (hSecKey == NULL)
- return FALSE;
- // necessary to cast away const below
- lResult = ::RegDeleteValue(hSecKey, (LPTSTR)lpszEntry);
- RegCloseKey(hSecKey);
- }
- else
- {
- HKEY hSecKey = GetSectionKey(lpszSection);
- if (hSecKey == NULL)
- return FALSE;
- lResult = RegSetValueEx(hSecKey, lpszEntry, NULL, REG_SZ,
- (LPBYTE)lpszValue, (lstrlen(lpszValue)+1)*sizeof(TCHAR));
- RegCloseKey(hSecKey);
- }
- return lResult == ERROR_SUCCESS;
- }
- else
- {
- ASSERT(m_pszProfileName != NULL);
- ASSERT(lstrlen(m_pszProfileName) < 4095); // can't read in bigger
- return ::WritePrivateProfileString(lpszSection, lpszEntry, lpszValue,
- m_pszProfileName);
- }
- }
-
- BOOL CWinApp::WriteProfileBinary(LPCTSTR lpszSection, LPCTSTR lpszEntry,
- LPBYTE pData, UINT nBytes)
- {
- ASSERT(lpszSection != NULL);
- if (m_pszRegistryKey != NULL)
- {
- LONG lResult;
- HKEY hSecKey = GetSectionKey(lpszSection);
- if (hSecKey == NULL)
- return FALSE;
- lResult = RegSetValueEx(hSecKey, lpszEntry, NULL, REG_BINARY,
- pData, nBytes);
- RegCloseKey(hSecKey);
- return lResult == ERROR_SUCCESS;
- }
-
- // convert to string and write out
- LPTSTR lpsz = new TCHAR[nBytes*2+1];
- for (UINT 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_pszProfileName != NULL);
-
- BOOL bResult = WriteProfileString(lpszSection, lpszEntry, lpsz);
- delete[] lpsz;
- return bResult;
- }
-
- /////////////////////////////////////////////////////////////////////////////
-