前言:在用mfc框架编写应用的时候,如果注意,你会发现在App应用类的InitInstance()函数中,初始化时总有一个 SetRegistryKey("String");  这是什么函数呢,设置记录字符串,不明觉厉,于是用心去查了一下,分享给大家。


总起:其实很明了,如果你的应用需要使用注册表,则它为你提供了很便利的方法,当然如果不使用系统注册表,这句可以注释掉。







SetRegistryKey Causes application settings to be stored in the registry instead of .INI files.





设置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.


具体用法:

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 = 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_PTR nLen = str.GetLength();
  *pBytes = UINT(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];
 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;

 

MFC函数—SetRegistryKey的更多相关文章

  1. MFC函数之BitBlt

    MFC函数之BitBlt // Cgame123View 绘制 void Cgame123View::OnDraw(CDC* pDC) { Cgame123Doc* pDoc = GetDocumen ...

  2. 破解 Rith's CrackMe #1(对比IDA查看动态分析中的MFC函数名)

    系统 : Windows xp 程序 : Rith's CrackMe #1 程序下载地址 :http://pan.baidu.com/s/1gecW9Qr 要求 : 注册机编写 使用工具 : IDA ...

  3. MFC函数—CWinApp::LoadStdProfileSettings

    从 InitInstance 成员函数内调用该函数,启用和加载最近使用的(MRU)文件和最后浏览状态的列表.void LoadStdProfileSettings(   UINT nMaxMRU = ...

  4. MFC函数—— CWnd::PreCreateWindow

     CWnd::PreCreateWindow virtual BOOL PreCreateWindow( CREATESTRUCT& cs ); 返回值: 如果要继续窗口的创建过程,则返回非零 ...

  5. 常见MFC函数

    1.MFC常用函数:WinExec()ExitWindowsEx()GlobalMemoryStatus()GetSystemInfo()GetSystemDirectory()GetWindowsD ...

  6. MFC函数—CSingleDocTemplate

    前提:在InitInstance() 函数的初始化过程中,我们可以看到代码CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDoc ...

  7. MFC函数—— CFrameWnd::OnCreateClient

    CFrameWnd::OnCreateClient virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext*pContext); ...

  8. MFC函数——CWnd::OnEraseBkgnd

    CWnd::OnEraseBkgnd afx_msg BOOL OnEraseBkgnd( CDC* pDC ); 返回值: 如果它擦除了背景,则返回非零值:否则返回0. 参数: pDC 指定了设备环 ...

  9. MFC函数——CWnd::OnCreate

    CWnd::OnCreate afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct ); 返回值: OnCreate必须返回0以继续CWnd对象的创建 ...

随机推荐

  1. [proposal][app]Watch your time!

    [Motivation] 很多时候,我们要去某个地方,尤其是第一次去的时候,都不知道什么时候出发,留出的时间够不够,会不会早到或者晚到.虽然地图软件能给出一些粗略的步行,公交,或者出租时间估计,但是每 ...

  2. caffe 每层结构

    如何在Caffe中配置每一个层的结构 最近刚在电脑上装好Caffe,由于神经网络中有不同的层结构,不同类型的层又有不同的参数,所有就根据Caffe官网的说明文档做了一个简单的总结. 1. Vision ...

  3. 如何将Skyline66嵌入WPF中

    1.新建WPF项目: 2.添加引用 .net引用:System.Windows.Forms和WindowsFormsIntegration skyline引用:AxInterop.TerraExplo ...

  4. MVVM双向绑定实现之Object.defineProperty

    随着web应用的发展,直接操作dom的应用已渐行渐远,取而代之的是时下越来越流行的MVVM框架,dom操作几乎绝迹,这里面自然是框架底层封装的结果.MVVM框架的双向数据绑定使开发效率大大提高:然后在 ...

  5. JQuery Mobile - html5+CSS 禁止IOS长按复制粘贴实现

    因为在移动端APP需要实现长按执行别的事件,但是在IOS系统有默认的长按选择复制粘贴,禁止此功能在网上找了很多资料,最终整理出目前最好的解决方法.实际测试,也并不是很理想,但是可能没有更好办法了! / ...

  6. Pyhon 中文编码问题(字符串前加‘U’)

    中文编码问题是用中文的程序员经常头大的问题,在python下也是如此,那么应该怎么理解和解决python的编码问题呢? 我们要知道python内部使用的是unicode编码,而外部却要面对千奇百怪的各 ...

  7. MariaDB 插入&更新&删除数据(8)

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...

  8. cpu 亲和性 affinity

    http://www.ibm.com/developerworks/cn/linux/l-affinity.html

  9. SpringCloud之Fegin

    Fegin是一个声明似的web服务客户端,它使得编写web服务客户端变得更加容易.使用Fegin创建一个接口并对它进行注解.它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持 ...

  10. [vue] [axios] 设置代理实现跨域时的纠错

    # 第一次做前端工程 # 记一个今天犯傻调查的问题 -------------------------------------------------------------------------- ...