來自:http://blog.sina.com.cn/s/blog_65cab32d01012a0l.html
在利用mfc框架的時候,在App應用類的InitInstance()函式中,初始化時總有一個 SetRegistryKey("字串XXX"),不知道究竟有何用處,這天仔細查看了一下,發現如果你使用注冊表,則它為你提供了很便利的方法,當然如果不使用系統注冊表,這句可以注釋掉,
以下是我在網上找到的一些資料:
| SetRegistryKey | Causes application settings to be stored in the registry instead of .INI files. |
SetRegistryKey 這個函式功能是設定MFC程式的注冊表訪問鍵,并把讀寫 ini 檔案的成員函式映射到讀寫注冊表,只要呼叫一下 SetRegistryKey 并指定注冊表鍵值,那么下面6個成員函式,就被映射到進行注冊表讀取了~
| WriteProfileBinary | Writes binary data to an entry in the application's .INI file. |
| WriteProfileInt | Writes an integer to an entry in the application's .INI file. |
| WriteProfileString | Writes a string to an entry in the application's .INI file. |
| GetProfileBinary | Retrieves binary data from an entry in the application's .INI file. |
| GetProfileInt | Retrieves an integer from an entry in the application's .INI file. |
| GetProfileString | Retrieves a string from an entry in the application's .INI file. |
MSDN上面寫上面6個函式是寫到INI檔案的,所以俺就忽略了其訪問注冊表的功能,無意中看了其MFC實作才有所了解,
例子如下:
SetRegistryKey(_T("boli's app")); //這里是準備在注冊表HKEY_CURRENT_USER\\software 下面生成一個boli's app 分支~為什么說是準備呢?因為如果不呼叫相關函式,如上面提到的6個函式,它是不會真正讀寫注冊表的,具體本文最最下面的MFC實作摘錄,
CString strUserName,strPassword;
WriteProfileString("LogInfo","UserName",strUserName); //向注冊表HKEY_CURRENT_USER\\software\\boli's app\\LogInfo\\分支下寫入 UserName 字串行鍵值~
WriteProfileString("LogInfo","Password",strPassword);//同上~
strUserName = GetProfileString("LogInfo","UserName");// 這里是讀取HKEY_CURRENT_USER\\software\\boli's app\\LogInfo\\分支下的 UserName 字串鍵值到 strUserName~
strPassword = GetProfileString("LogInfo","Password");
如果不是在CWinApp 派生的類中讀寫注冊表,可以直接用:
strUserName = theApp.GetProfileString("LogInfo","UserName");
strPassword = theApp.GetProfileString("LogInfo","Password");
或
strUserName = AfxGetApp()->GetProfileString("LogInfo","UserName");
條條大路通羅馬,
下列是mfc實作的代碼:
////////////////////////////////////////////////////////////////////////////
// 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 = _T(""); // 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 = https://www.cnblogs.com/fzy456/archive/2020/10/09/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 = https://www.cnblogs.com/fzy456/archive/2020/10/09/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 = https://www.cnblogs.com/fzy456/archive/2020/10/09/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_PTR nLen = str.GetLength();
*pBytes = UINT(nLen) / 2;
*ppData = https://www.cnblogs.com/fzy456/archive/2020/10/09/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 =https://www.cnblogs.com/fzy456/archive/2020/10/09/= 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];
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_pszProfileName != NULL);
BOOL bResult = WriteProfileString(lpszSection, lpszEntry, lpsz);
delete[] lpsz;
return bResult;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/164770.html
標籤:其他
