RegQueryValueEx(hKeyUser, TEXT("User"), 0, &ulType, strUser, &ulLen);
/*
其中hKeyUser为一个已经打开的注册项.
另外的变量也都正确, 为什么这句话会出错?
*/
//当然, 如果只是这样就不奇怪了, 奇怪的是我使用这个句子两次的时候, 一切都正常了, 就是如下方式:
RegQueryValueEx(hKeyUser, TEXT("User"), 0, &ulType, strUser, &ulLen);//把这句删掉就出错了.
if(0 == RegQueryValueEx(hKeyUser, TEXT("User"), 0, &ulType, strUser, &ulLen))
{
//可以执行到这里, 获得的内容也完全正常.
}
11 个解决方案
#1
我看了MSDN的代码, 都不要这样的, 直接一次读取注册表就成功了, 但是我这样却出错.
假如我要读取一个注册项, 都要读取两次才成功, 否则一定错误, 各位能给小弟讲解一下原因吗?
#2
试试下面这段代码如何:
if ( RegOpenKeyEx(hkey, lpszPath, 0, KEY_QUERY_VALUE, &key) != ERROR_SUCCESS)
throw -1;
TCHAR szBuf[2048] = {0};
DWORD dwBufLen = 2048;
LONG lRet = RegQueryValueEx( key, lpszKey, NULL, NULL, (LPBYTE) szBuf, &dwBufLen);
RegCloseKey(key);
if ( RegOpenKeyEx(hkey, lpszPath, 0, KEY_QUERY_VALUE, &key) != ERROR_SUCCESS)
throw -1;
TCHAR szBuf[2048] = {0};
DWORD dwBufLen = 2048;
LONG lRet = RegQueryValueEx( key, lpszKey, NULL, NULL, (LPBYTE) szBuf, &dwBufLen);
RegCloseKey(key);
#3
char sz[_MAX_PATH];
ULONG ulSize = _MAX_PATH;
Access = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\XXXX\\XXX", 0, KEY_READ, &hKey);
if(Access == ERROR_SUCCESS) {
LQuery = ::RegQueryValueEx(hKey,"XXXX", NULL, NULL, (LPBYTE)sz, &ulSize);
if(LQuery != ERROR_SUCCESS) {
::RegCloseKey(hKey);
}
ULONG ulSize = _MAX_PATH;
Access = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\XXXX\\XXX", 0, KEY_READ, &hKey);
if(Access == ERROR_SUCCESS) {
LQuery = ::RegQueryValueEx(hKey,"XXXX", NULL, NULL, (LPBYTE)sz, &ulSize);
if(LQuery != ERROR_SUCCESS) {
::RegCloseKey(hKey);
}
#4
RegQueryValueEx(hKeyUser, TEXT("User"), 0, &ulType, strUser, &ulLen);
你的ultype的值没有赋或者不正确,然后try
你的ultype的值没有赋或者不正确,然后try
#5
up
#6
同意上面的先打开一次,然后再查找
#7
找一个注册表的类吧,象你这样多累,要懂得利用前人的成果
#8
确保OPEN后,
把0改为NULL。
RegQueryValueEx(hKeyUser, "User", NULL, &ulType, strUser, &ulLen);
把0改为NULL。
RegQueryValueEx(hKeyUser, "User", NULL, &ulType, strUser, &ulLen);
#9
错了, 我发现问题不是这些, 是RegCloseKey()有错.
如:
//hKey为一个值x
RegCloseKey(hKey);
//hKey的值还没有变动.
如:
//hKey为一个值x
RegCloseKey(hKey);
//hKey的值还没有变动.
#10
RegOpenKeyEx(hBaseKey, strKeyPath, 0, KEY_QUERY_VALUE, &hKeyTemp);
RegQueryValueEx(hKeyTemp, strKeyName, 0, 0, (LPBYTE)strKeyString, &ulLen);
RegCloseKey(hKeyTemp);
//到这里为止都是正确的.
但是再打开的时候就出错了, 必须要RegQueryValueEx()函数执行两次才可以.
RegQueryValueEx(hKeyTemp, strKeyName, 0, 0, (LPBYTE)strKeyString, &ulLen);
RegCloseKey(hKeyTemp);
//到这里为止都是正确的.
但是再打开的时候就出错了, 必须要RegQueryValueEx()函数执行两次才可以.
#11
但是在RegCloseKey();之前就执行的话, 也会出错.
#1
我看了MSDN的代码, 都不要这样的, 直接一次读取注册表就成功了, 但是我这样却出错.
假如我要读取一个注册项, 都要读取两次才成功, 否则一定错误, 各位能给小弟讲解一下原因吗?
#2
试试下面这段代码如何:
if ( RegOpenKeyEx(hkey, lpszPath, 0, KEY_QUERY_VALUE, &key) != ERROR_SUCCESS)
throw -1;
TCHAR szBuf[2048] = {0};
DWORD dwBufLen = 2048;
LONG lRet = RegQueryValueEx( key, lpszKey, NULL, NULL, (LPBYTE) szBuf, &dwBufLen);
RegCloseKey(key);
if ( RegOpenKeyEx(hkey, lpszPath, 0, KEY_QUERY_VALUE, &key) != ERROR_SUCCESS)
throw -1;
TCHAR szBuf[2048] = {0};
DWORD dwBufLen = 2048;
LONG lRet = RegQueryValueEx( key, lpszKey, NULL, NULL, (LPBYTE) szBuf, &dwBufLen);
RegCloseKey(key);
#3
char sz[_MAX_PATH];
ULONG ulSize = _MAX_PATH;
Access = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\XXXX\\XXX", 0, KEY_READ, &hKey);
if(Access == ERROR_SUCCESS) {
LQuery = ::RegQueryValueEx(hKey,"XXXX", NULL, NULL, (LPBYTE)sz, &ulSize);
if(LQuery != ERROR_SUCCESS) {
::RegCloseKey(hKey);
}
ULONG ulSize = _MAX_PATH;
Access = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\XXXX\\XXX", 0, KEY_READ, &hKey);
if(Access == ERROR_SUCCESS) {
LQuery = ::RegQueryValueEx(hKey,"XXXX", NULL, NULL, (LPBYTE)sz, &ulSize);
if(LQuery != ERROR_SUCCESS) {
::RegCloseKey(hKey);
}
#4
RegQueryValueEx(hKeyUser, TEXT("User"), 0, &ulType, strUser, &ulLen);
你的ultype的值没有赋或者不正确,然后try
你的ultype的值没有赋或者不正确,然后try
#5
up
#6
同意上面的先打开一次,然后再查找
#7
找一个注册表的类吧,象你这样多累,要懂得利用前人的成果
#8
确保OPEN后,
把0改为NULL。
RegQueryValueEx(hKeyUser, "User", NULL, &ulType, strUser, &ulLen);
把0改为NULL。
RegQueryValueEx(hKeyUser, "User", NULL, &ulType, strUser, &ulLen);
#9
错了, 我发现问题不是这些, 是RegCloseKey()有错.
如:
//hKey为一个值x
RegCloseKey(hKey);
//hKey的值还没有变动.
如:
//hKey为一个值x
RegCloseKey(hKey);
//hKey的值还没有变动.
#10
RegOpenKeyEx(hBaseKey, strKeyPath, 0, KEY_QUERY_VALUE, &hKeyTemp);
RegQueryValueEx(hKeyTemp, strKeyName, 0, 0, (LPBYTE)strKeyString, &ulLen);
RegCloseKey(hKeyTemp);
//到这里为止都是正确的.
但是再打开的时候就出错了, 必须要RegQueryValueEx()函数执行两次才可以.
RegQueryValueEx(hKeyTemp, strKeyName, 0, 0, (LPBYTE)strKeyString, &ulLen);
RegCloseKey(hKeyTemp);
//到这里为止都是正确的.
但是再打开的时候就出错了, 必须要RegQueryValueEx()函数执行两次才可以.
#11
但是在RegCloseKey();之前就执行的话, 也会出错.