[英]Help with enum values in registry c++
DWORD type = REG_NONE;
int i = 0;
size = sizeof(ValueName);
size2 = sizeof(ValueData);
BOOL bContinue = TRUE;
do
{
lRet = RegEnumValue(Hkey , i , ValueName , &size , 0 , &type , ValueData , &size2);
switch(lRet)
{
case ERROR_SUCCESS:
print_values(ValueName , type , ValueData , size2);
i++;
size = sizeof(ValueName);
size2 = sizeof(ValueData);
break;
case ERROR_MORE_DATA:
size2 = sizeof(ValueData);
if(NULL != ValueData) delete [] ValueData;
ValueData = new BYTE[size2];
break;
case ERROR_NO_MORE_ITEMS:
bContinue = false;
break;
default:
cout << "Unexpected error: " << GetLastError() << endl;
bContinue = false;
break;
}
}while(bContinue);
它總是轉到ERROR_NO_MORE_DATA,為什么? :-/
編輯:
抱歉,ment:ERROR_MORE_DATA :)我更改了一些內容,仍然無法正常工作
class Registry {
public:
Registry();
~Registry();
bool open_key_ex(HKEY hkey, const char * key, HKEY & hkey_out);
void querry_info_key(HKEY);
void enum_key(HKEY , DWORD);
void enum_value(HKEY);
void print_values(LPCSTR , DWORD , LPBYTE , DWORD);
void run();
private:
HKEY hkey;
long lRet;
FILETIME filetime;
DWORD sub_keys;
TCHAR* ValueName;
DWORD size;
LPBYTE ValueData;
DWORD size2;
HKEY a;
DWORD MaxValueLen;
DWORD MaxDataLen;
};
Registry::Registry()
{
ValueName = new TCHAR[MAX_PATH];
ValueData = NULL;
MaxValueLen = MAX_PATH + 1;
MaxDataLen = 0;
}
Registry::~Registry()
{
delete [] ValueName;
}
void Registry::enum_value(HKEY Hkey)
{
DWORD type = REG_NONE;
int i = 0;
size2 = MaxDataLen;
BOOL bContinue = TRUE;
do
{
lRet = RegEnumValue(Hkey , i , ValueName , &size , 0 , &type , ValueData , &size2);
size = MaxValueLen;
switch(lRet)
{
case ERROR_SUCCESS:
print_values(ValueName , type , ValueData , size2);
size2 = MaxDataLen;
i++;
break;
case ERROR_MORE_DATA:
MaxDataLen = size2;
if(NULL != ValueData) delete [] ValueData;
ValueData = new BYTE[MaxDataLen];
break;
case ERROR_NO_MORE_ITEMS:
bContinue = false;
break;
default:
cout << "Unexpected error: " << GetLastError() << endl;
bContinue = false;
break;
}
}while(bContinue);
}
我懷疑這與此有關:
size2 = sizeof(ValueData);
盡管我看不到ValueData
的聲明,但很顯然它是一個指針,而不是數組。 因此, sizeof
將為您提供指針的大小,而不是指針所指向的緩沖區的大小。 您需要自己跟蹤尺寸。 ValueName
可能也是如此,但我無法確定。
從http://msdn.microsoft.com/zh-cn/library/ms724865%28VS.85%29.aspx :
如果lpData指定的緩沖區不足以容納數據,則該函數返回ERROR_MORE_DATA並將所需的緩沖區大小存儲在lpcbData指向的變量中。 在這種情況下,lpData的內容是不確定的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.