Windows API一日一练(65)RegQueryValueEx函数

Post date: 2012/3/27 上午 07:40:35

分类: Direct3D2007-11-05 21:42 6670人阅读 评论(4) 收藏 举报

上一次介绍怎么样保存数据到注册表里,这次就需要从注册表里读取数据出来了。在这个例子里是读取字符串数据出来,主要调用函数RegQueryValueEx来实现。下面的例子里就是先查询键值的长度,然后再读取内容出来。

函数RegQueryValueEx声明如下:

WINADVAPI

LONG

APIENTRY

RegQueryValueExA (

__in HKEY hKey,

__in_opt LPCSTR lpValueName,

__reserved LPDWORD lpReserved,

__out_opt LPDWORD lpType,

__out_bcount_opt(*lpcbData) LPBYTE lpData,

__inout_opt LPDWORD lpcbData

);

WINADVAPI

LONG

APIENTRY

RegQueryValueExW (

__in HKEY hKey,

__in_opt LPCWSTR lpValueName,

__reserved LPDWORD lpReserved,

__out_opt LPDWORD lpType,

__out_bcount_opt(*lpcbData) LPBYTE lpData,

__inout_opt LPDWORD lpcbData

);

#ifdef UNICODE

#define RegQueryValueEx RegQueryValueExW

#else

#define RegQueryValueEx RegQueryValueExA

#endif // !UNICODE

hKey是主键。

lpValueName是键值名称。

lpType是类型。

lpData是读出来数据保存地方。

lpcbData是读取数据多少。

调用函数的例子如下:

#001 //打注册表返回值。HKEY_CURRENT_USER/"Software"/"Wincpp"/"testreg"

#002 // /"Windows"//"winsize" = "800*600"

#003 //蔡军生 2007/11/05 QQ:9073204 深圳

#004 std::wstring GetProfileString(LPCTSTR lpszSection, LPCTSTR lpszEntry,

#005 LPCTSTR lpszDefault)

#006 {

#007 //打开应用程序键。

#008 HKEY hAppKey = GetAppRegistryKey();

#009 if (hAppKey == NULL)

#010 {

#011 return lpszDefault;

#012 }

#013

#014 HKEY hSecKey = NULL;

#015 DWORD dw;

#016

#017 //打开子键。

#018 RegCreateKeyEx(hAppKey, lpszSection, 0, REG_NONE,

#019 REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL,

#020 &hSecKey, &dw);

#021 RegCloseKey(hAppKey);

#022

#023 if (hSecKey == NULL)

#024 {

#025 return lpszDefault;

#026 }

#027

#028 //查询键值。

#029 std::wstring strValue;

#030 DWORD dwType=REG_NONE;

#031 DWORD dwCount=0;

#032

#033 //先查询键值的长度。

#034 LONG lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,

#035 NULL, &dwCount);

#036 if (lResult == ERROR_SUCCESS)

#037 {

#038 strValue.resize(dwCount);

#039

#040 //查询键值。

#041 lResult = RegQueryValueEx(hSecKey, (LPTSTR)lpszEntry, NULL, &dwType,

#042 (LPBYTE)strValue.data(), &dwCount);

#043

#044 }

#045

#046 RegCloseKey(hSecKey);

#047 if (lResult == ERROR_SUCCESS)

#048 {

#049 return strValue;

#050 }

#051

#052 return lpszDefault;

#053 }