怎么使用API读写注册表? 奇怪的问题

时间:2022-08-05 15:38:09

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);

#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);
}

#4


RegQueryValueEx(hKeyUser, TEXT("User"), 0, &ulType, strUser, &ulLen);
你的ultype的值没有赋或者不正确,然后try

#5


up

#6


同意上面的先打开一次,然后再查找

#7


找一个注册表的类吧,象你这样多累,要懂得利用前人的成果

#8


确保OPEN后,
把0改为NULL。
RegQueryValueEx(hKeyUser, "User", NULL, &ulType, strUser, &ulLen);

#9


错了, 我发现问题不是这些, 是RegCloseKey()有错.

如: 
//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()函数执行两次才可以.

#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);

#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);
}

#4


RegQueryValueEx(hKeyUser, TEXT("User"), 0, &ulType, strUser, &ulLen);
你的ultype的值没有赋或者不正确,然后try

#5


up

#6


同意上面的先打开一次,然后再查找

#7


找一个注册表的类吧,象你这样多累,要懂得利用前人的成果

#8


确保OPEN后,
把0改为NULL。
RegQueryValueEx(hKeyUser, "User", NULL, &ulType, strUser, &ulLen);

#9


错了, 我发现问题不是这些, 是RegCloseKey()有错.

如: 
//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()函数执行两次才可以.

#11


但是在RegCloseKey();之前就执行的话, 也会出错.