MFC学习:管理程序配置
2024-03-17 17:33:41
CWinApp 的配置管理接口
CWinApp
与设置相关的接口有
CWinApp::WriteProfileInt
CWinApp::WriteProfileString
CWinApp::WriteProfileBinary
看看WriteProfileInt
的实现
1 | BOOL CWinApp::WriteProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, |
知识点:
- 优先考虑写入到注册表,但如果未设置
m_pszRegistryKey
值,则会写入到 ini 文件中。 m_pszRegistryKey
默认值是nullptr
,可以用 CWinApp::SetRegistryKey 修改它。m_pszProfileName
是在程序启动时初始化的,默认用程序的文件名加上INI
后缀。MFC 没有提供函数修改它,但是可以直接对其赋值。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15void CWinApp::SetCurrentHandles()
{
...
if (m_pszProfileName == NULL)
{
Checked::tcscat_s(szExeName, _countof(szExeName), _T(".INI")); // will be enough room in buffer
BOOL bEnable = AfxEnableMemoryTracking(FALSE);
m_pszProfileName = _tcsdup(szExeName);
AfxEnableMemoryTracking(bEnable);
if(!m_pszProfileName)
{
AfxThrowMemoryException();
}
}
}- 如果
m_pszProfileName
仅仅只有文件名,文件会保存到C:\Windows
目录下,所以建议用相对路径的形式.\Config.ini
,或着绝对路径。 - 当使用注册表保存时,
m_pszProfileName
就变为了Key
如果程序文件名为1
2this->SetRegistryKey(_T("XX公司"));
this->WriteProfileInt(_T("root"), _T("entry"), 123);MyApp.exe
,最终写入的注册表位置为1
HKEY_CURRENT_USER\SOFTWARE\{m_pszRegistryKey}\{m_pszProfileName}\
INI文件例子:
1 | this->WriteProfileInt(_T("root"), _T("item"), 123); |
ini 内容
1 | [root] |
CWinAppEx 的配置管理接口
CWinAppEx
在CWinApp
的基础上,扩充了一些接口,相关函数同样以Write
开头,扩展的方法是
- CWinAppEx::WriteInt
- CWinAppEx::WriteString
- CWinAppEx::WriteBinary
- CWinAppEx::WriteObject
- CWinAppEx::WriteSectionInt
- CWinAppEx::WriteSectionString
- CWinAppEx::WriteSectionBinary
- CWinAppEx::WriteSectionObject
方法中带Section
的写入注册表位置是
1 | HKEY_CURRENT_USER\SOFTWARE\{m_pszRegistryKey}\{m_pszProfileName}\{m_strRegSection}\{Section} |
方法中不带Section
的写入注册表位置是
1 | HKEY_CURRENT_USER\SOFTWARE\{m_pszRegistryKey}\{m_pszProfileName}\{m_strRegSection}\ |
路径中m_strRegSection
的默认值是Workspace
,可以通过 CWinAppEx::SetRegistryBase 方法修改它。
总结
CWinApp
的方法可选择写入注册表或是INI文件,默认情况下写INI文件。CWinAppEx
提供的方法只能写入注册表,所以必须填充m_pszRegistryKey
值。
对于写注册表来说,m_pszRegistryKey
一般填入组织名称,m_pszProfileName
填入产品名称,m_strRegSection
填入子模块名称。CWinApp
的以WriteProfile
开头的方法虽然可以写注册表,但是因为没有m_strRegSection
字段,没法按模块分别写入不同的位置,所以不建议使用,除非你的工程只有一个模块。