mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
370 lines
8.9 KiB
370 lines
8.9 KiB
// This is a part of the Microsoft Foundation Classes C++ library.
|
|
// Copyright (C) 1992-1995 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
|
|
|
|
// INI strings are not localized
|
|
static const TCHAR szSoftware[] = _T("Software");
|
|
|
|
#ifdef AFX_INIT_SEG
|
|
#pragma code_seg(AFX_INIT_SEG)
|
|
#endif
|
|
|
|
void CWinApp::SetRegistryKey(LPCTSTR lpszRegistryKey)
|
|
{
|
|
UNUSED(lpszRegistryKey); // not used in release mac builds
|
|
|
|
ASSERT(m_pszRegistryKey == NULL);
|
|
ASSERT(lpszRegistryKey != NULL);
|
|
ASSERT(m_pszAppName != NULL);
|
|
|
|
#ifndef _MAC
|
|
BOOL bEnable = AfxEnableMemoryTracking(FALSE);
|
|
free((void*)m_pszRegistryKey);
|
|
m_pszRegistryKey = _tcsdup(lpszRegistryKey);
|
|
free((void*)m_pszProfileName);
|
|
m_pszProfileName = _tcsdup(m_pszAppName);
|
|
AfxEnableMemoryTracking(bEnable);
|
|
#endif
|
|
}
|
|
|
|
void CWinApp::SetRegistryKey(UINT nIDRegistryKey)
|
|
{
|
|
ASSERT(m_pszRegistryKey == NULL);
|
|
|
|
#ifndef _MAC
|
|
TCHAR szRegistryKey[256];
|
|
VERIFY(AfxLoadString(nIDRegistryKey, szRegistryKey));
|
|
SetRegistryKey(szRegistryKey);
|
|
#else
|
|
UNUSED_ALWAYS(nIDRegistryKey);
|
|
#endif
|
|
}
|
|
|
|
#ifndef _MAC
|
|
// 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, szSoftware, 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;
|
|
}
|
|
#endif //!_MAC
|
|
|
|
UINT CWinApp::GetProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry,
|
|
int nDefault)
|
|
{
|
|
ASSERT(lpszSection != NULL);
|
|
ASSERT(lpszEntry != NULL);
|
|
#ifndef _MAC
|
|
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
|
|
#endif
|
|
{
|
|
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);
|
|
#ifndef _MAC
|
|
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
|
|
#endif
|
|
{
|
|
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;
|
|
#ifndef _MAC
|
|
if (m_pszRegistryKey != NULL)
|
|
{
|
|
LPBYTE lpByte = 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
|
|
#endif
|
|
{
|
|
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);
|
|
#ifndef _MAC
|
|
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
|
|
#endif
|
|
{
|
|
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);
|
|
#ifndef _MAC
|
|
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
|
|
#endif
|
|
{
|
|
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);
|
|
#ifndef _MAC
|
|
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;
|
|
}
|
|
#endif
|
|
// 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;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|