我的YUV播放器MFC小笔记:注册表读写

在使用YUV Player Deluxe时,发现其可保存上一次的参数,研究之后,才知道它是使用注册表来实现的。下面是YUV播放器与注册表有关的函数接口,注册表与了我的大名外,其它值是参照YUV Player Deluxe的。在写这篇文章时,还没有空完全实现播放参数的保存,主要是用户自定义的分辨率的添加和删除,还要排序。有点工作量。

判断注册表节点是否存在函数:

1
2
3
4
5
6
7
8
BOOL CSettingDlg::ExistRegistration()
{
HKEY hKey;
int ret = 0;
ret = RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\YUVPlayer-latelee.org"), 0, KEY_ALL_ACCESS, &hKey);
RegCloseKey(hKey);
return !ret;
}

写注册表函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CSettingDlg::SetRegistration(CString& strSize, int width, int height, int fpsidx, int fmt, int loop)
{
HKEY hKey;

RegCreateKey(HKEY_CURRENT_USER, _T("Software\\YUVPlayer-latelee.org\\Setting"), &hKey);
RegSetValueEx(hKey, _T("AddedSize"), 0, REG_SZ, (BYTE*)(strSize.GetBuffer()), strSize.GetLength()*sizeof(TCHAR));
RegSetValueEx(hKey, _T("FrameWidth"), 0, REG_DWORD, (BYTE*)&width, 4);
RegSetValueEx(hKey, _T("FrameHeight"), 0, REG_DWORD, (BYTE*)&height, 4);
RegSetValueEx(hKey, _T("FrameRate"), 0, REG_DWORD, (BYTE*)&fpsidx, 4);
RegSetValueEx(hKey, _T("CurrentPixelFormat"), 0, REG_DWORD, (BYTE*)&fmt, 4);
RegSetValueEx(hKey, _T("Loop"), 0, REG_DWORD, (BYTE*)&loop, 4);

RegCloseKey(hKey);
}

读注册表函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void CSettingDlg::GetRegistration(CString& strSize, int& width, int& height, int& fpsidx, int& fmt, int& loop)
{
HKEY hKey;
DWORD dwType = 0;
DWORD dwLen = 1024; // 此处值是否适合?CString类型如何给定长度?
BYTE szBuffer[1024] = {0};
RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\YUVPlayer-latelee.org\\Setting"), 0, KEY_QUERY_VALUE, &hKey);
RegQueryValueEx(hKey, _T("AddedSize"), NULL, &dwType, szBuffer, &dwLen);

RegQueryValueEx(hKey, _T("FrameWidth"), NULL, &dwType, (BYTE*)&width, &dwLen);
RegQueryValueEx(hKey, _T("FrameHeight"), NULL, &dwType, (BYTE*)&height, &dwLen);
RegQueryValueEx(hKey, _T("FrameRate"), NULL, &dwType, (BYTE*)&fpsidx, &dwLen);
RegQueryValueEx(hKey, _T("CurrentPixelFormat"), NULL, &dwType, (BYTE*)&fmt, &dwLen);
RegQueryValueEx(hKey, _T("Loop"), NULL, &dwType, (BYTE*)&loop, &dwLen);


strSize.Format(_T("%s"), szBuffer);


RegCloseKey(hKey);
}

在AddedSize参数中,本来是使用strSize.GetBuffer()来存储获取的值(即分辨率),在调试时,发现会有错误,于是改用szBuffer。因为在类中使用m_strAddedSize,在构造函数里,我已经按默认值初始化一次,可能CString长度固定了,后来添加分辨率的话,长度变长,会有溢出。纯粹是个人猜测。
在初始化时,会去读注册表的值,如不存在,会先将默认值写进去。

1
2
3
4
5
6
7
// default
if (!ExistRegistration())
{
SetRegistration(m_strAddedSize, m_nWidth,m_nHeight, m_nFpsIndex, m_nYuvFormat, m_fLoop);
}
// read
GetRegistration(m_strAddedSize, m_nWidth, m_nHeight, m_nFpsIndex, m_nYuvFormat, m_fLoop);

李迟 2015.8.15 晚