我用RegQueryValueEx()读REG_SZ的一些值,在几条RegQureyValueEx()的顺序改变时,有时正确,有时(换个顺序时)返回值是234,用Error Lookup查一下,说是More data is available.
我只是读进一个字符串,而字符串首址传入RegQueryValueEx()之前已经开辟了256字节的空间,怎么可能读不尽区区十来个字符的REG_SZ??
而我继续读入REG_DWORD时,也会出现这样的错误。我实在迷茫了!
我只是读进一个字符串,而字符串首址传入RegQueryValueEx()之前已经开辟了256字节的空间,怎么可能读不尽区区十来个字符的REG_SZ??
而我继续读入REG_DWORD时,也会出现这样的错误。我实在迷茫了!
HKEY hKey, // handle to key to query
LPTSTR lpValueName, // address of name of value to query
LPDWORD lpReserved, // reserved
LPDWORD lpType, // address of buffer for value type
LPBYTE lpData, // address of data buffer
LPDWORD lpcbData // address of data buffer size
);
注意一下最后一个参数
//打开注册表取数据
DWORD dwRet;
LONG ret;
ret=RegCreateKeyEx(HKEY_CURRENT_USER,
"Software\\CrazyCount\\", 0L,
NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
NULL, &hKey, &dwRet); if(dwRet==REG_CREATED_NEW_KEY)
{
//创建新的键值
WriteReg(0);
}
else if(dwRet==REG_OPENED_EXISTING_KEY)
{
//读取注册表数据
DWORD len = 4;
ret = RegQueryValueEx(hKey, "Current", 0, NULL,
(BYTE*)&m_dwCurrent, &len);
ret = RegQueryValueEx(hKey, "Num", 0, NULL,
(BYTE*)&m_dwNum, &len);
LPBYTE buffer=new BYTE[1024];
len = 1024;
ret = RegQueryValueEx(hKey, "Sentence", 0, NULL,
buffer, &len);
m_strSentence = (LPCSTR)buffer;
len = 1024;
ret = RegQueryValueEx(hKey, "Explain", 0, NULL,
buffer, &len);
m_strExplain = (LPCSTR)buffer;
delete[] buffer;
}
else
{
AfxMessageBox("注册表出错!");
return TRUE;
} AssertReg(ret);void CCrazyCountDlg::AssertReg(LONG ret)
{
//显示错误信息
if(ret)
{
LPTSTR lpMsg=new char[81];
::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
0, ret, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
lpMsg, 80, NULL);
MessageBox(lpMsg);
delete[] lpMsg;
}
}
// 描述 : 设置注册表键值
// 返回类型 : BOOL
// 参数 : HKEY hkey
// 参数 : LPCTSTR const lpSubKey
// 参数 : LPCTSTR const lpValueName
// 参数 : LPCTSTR const lpValueBOOL SetRegValue(const HKEY hkey, LPCTSTR const lpSubKey, LPCTSTR const lpValueName, LPCTSTR const lpValue)
{
if(hkey == NULL || lpValue == NULL) return FALSE; HKEY hkeyResult = NULL;
LONG nResult;
DWORD dwDisposition; __try
{
// 打开注册表键
nResult = RegCreateKeyEx(hkey,
lpSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkeyResult,
&dwDisposition); if(nResult != ERROR_SUCCESS) __leave; nResult = RegSetValueEx(hkeyResult,
lpValueName,
0,
REG_SZ,
(LPBYTE)lpValue,
(_tcslen(lpValue) + 1) * sizeof(TCHAR));
}
__finally
{
RegCloseKey(hkeyResult);
} if(nResult == ERROR_SUCCESS) return TRUE;
return FALSE;
}// 函数名称 : GetRegValue
// 描述 : 获取指定注册表键的值(字符串)
// 返回类型 : BOOL - 指示函数是否成功执行
// 参数 : HKEY hkey - 注册表句柄
// 参数 : LPCTSTR const lpSubKey - 子键
// 参数 : LPCTSTR const lpValueName - 值名称
// 参数 : LPTSTR& lpValue - 值(必须为NULL)BOOL GetRegValue(const HKEY hkey, LPCTSTR const lpSubKey, LPCTSTR const lpValueName, LPTSTR& lpValue)
{
HKEY hkeyResult = NULL;
DWORD dwDisposition;
LPTSTR lpData = NULL;
DWORD cbData = MAX_PATH * sizeof(TCHAR);
LONG nResult; if(lpValue != NULL) delete lpValue;
lpValue = NULL; __try
{
// 打开注册表键
nResult = RegCreateKeyEx(hkey,
lpSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkeyResult,
&dwDisposition); if(nResult != ERROR_SUCCESS) __leave; // 获取键值
lpData = new TCHAR[MAX_PATH];
ZeroMemory(lpData, sizeof(TCHAR) * MAX_PATH); DWORD dwType = REG_SZ;
nResult = RegQueryValueEx(hkeyResult,
lpValueName,
0,
&dwType,
(LPBYTE)lpData,
&cbData); if(nResult != ERROR_SUCCESS) __leave;
lpValue = new TCHAR[cbData / sizeof(TCHAR) + 1];
_tcscpy(lpValue, lpData); }
__finally
{
delete lpData;
RegCloseKey(hkeyResult);
} if(nResult == ERROR_SUCCESS) return TRUE;
return FALSE;
}
调用:LPTSTR lpValue = NULL;
GetRegValue(HKEY_CURRENT_USER, TEXT("SOFTWARE\\nesgood.com\\FastTaskSwitch"), TEXT("UseAltTab"), lpValue));
delete lpValue;
lpValue = NULL;
在MFC里面用可以改成使用CString
// 描述 : 设置注册表键值
// 返回类型 : BOOL
// 参数 : HKEY hkey
// 参数 : LPCTSTR const lpSubKey
// 参数 : LPCTSTR const lpValueName
// 参数 : LPCTSTR const lpValueBOOL SetRegValue(const HKEY hkey, LPCTSTR const lpSubKey, LPCTSTR const lpValueName, LPCTSTR const lpValue)
{
if(hkey == NULL || lpValue == NULL) return FALSE; HKEY hkeyResult = NULL;
LONG nResult;
DWORD dwDisposition; __try
{
// 打开注册表键
nResult = RegCreateKeyEx(hkey,
lpSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkeyResult,
&dwDisposition); if(nResult != ERROR_SUCCESS) __leave; nResult = RegSetValueEx(hkeyResult,
lpValueName,
0,
REG_SZ,
(LPBYTE)lpValue,
(_tcslen(lpValue) + 1) * sizeof(TCHAR));
}
__finally
{
RegCloseKey(hkeyResult);
} if(nResult == ERROR_SUCCESS) return TRUE;
return FALSE;
}// 函数名称 : GetRegValue
// 描述 : 获取指定注册表键的值(字符串)
// 返回类型 : BOOL - 指示函数是否成功执行
// 参数 : HKEY hkey - 注册表句柄
// 参数 : LPCTSTR const lpSubKey - 子键
// 参数 : LPCTSTR const lpValueName - 值名称
// 参数 : LPTSTR& lpValue - 值(必须为NULL)BOOL GetRegValue(const HKEY hkey, LPCTSTR const lpSubKey, LPCTSTR const lpValueName, LPTSTR& lpValue)
{
HKEY hkeyResult = NULL;
DWORD dwDisposition;
LPTSTR lpData = NULL;
DWORD cbData = MAX_PATH * sizeof(TCHAR);
LONG nResult; if(lpValue != NULL) delete lpValue;
lpValue = NULL; __try
{
// 打开注册表键
nResult = RegCreateKeyEx(hkey,
lpSubKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkeyResult,
&dwDisposition); if(nResult != ERROR_SUCCESS) __leave; // 获取键值
lpData = new TCHAR[MAX_PATH];
ZeroMemory(lpData, sizeof(TCHAR) * MAX_PATH); DWORD dwType = REG_SZ;
nResult = RegQueryValueEx(hkeyResult,
lpValueName,
0,
&dwType,
(LPBYTE)lpData,
&cbData); if(nResult != ERROR_SUCCESS) __leave;
lpValue = new TCHAR[cbData / sizeof(TCHAR) + 1];
_tcscpy(lpValue, lpData); }
__finally
{
delete lpData;
RegCloseKey(hkeyResult);
} if(nResult == ERROR_SUCCESS) return TRUE;
return FALSE;
}
调用:LPTSTR lpValue = NULL;
GetRegValue(HKEY_LOCALMACHINE_USER, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup"), TEXT("SourcePath"), lpValue));最后用完了释放内存:
delete lpValue;在MFC里面用可以改成使用CString不好意思,刚刚贴出来的乱了。