我的YUV播放器MFC小笔记:注册表读写
在使用YUV Player Deluxe时,发现其可保存上一次的参数,研究之后,才知道它是使用注册表来实现的。下面是YUV播放器与注册表有关的函数接口,注册表与了我的大名外,其它值是参照YUV Player Deluxe的。在写这篇文章时,还没有空完全实现播放参数的保存,主要是用户自定义的分辨率的添加和删除,还要排序。有点工作量。
判断注册表节点是否存在函数:
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; }
写注册表函数:
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); }
读注册表函数:
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长度固定了,后来添加分辨率的话,长度变长,会有溢出。纯粹是个人猜测。
在初始化时,会去读注册表的值,如不存在,会先将默认值写进去。
// 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 晚
近来经济拮据,如本文对阁下有帮助,可慷慨解囊赞助笔者以输出更多好文章。
支付宝[email protected] 或 微信fly_camel_fly 均可。感谢!
本文固定链接: /programming-under-windows/yuvplayer-registration-write.html