// 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> 4) & 0x0F) + 'A'); //high nibble } lpsz[i*2] = 0; ASSERT(m_pszProfileName != NULL); BOOL bResult = WriteProfileString(lpszSection, lpszEntry, lpsz); delete[] lpsz; return bResult; } /////////////////////////////////////////////////////////////////////////////