注册表函数RegEnumValue()如何正确使用?
我是这样用的:
int num=0;
char str[20];
DWORD th=20;
DWORD type;
char strv[255];
DWORD vl=254;
DWORD suc;
::RegOpenkey(……);
suc=::RegEnumValue(hkey,(dword)num,str,NULL,&type,strv,&vl);
一运行,说变量有错,(我在vb6.0中使用可以,怎么在vc里却不下?)
请高手解答!!谢谢!
我是这样用的:
int num=0;
char str[20];
DWORD th=20;
DWORD type;
char strv[255];
DWORD vl=254;
DWORD suc;
::RegOpenkey(……);
suc=::RegEnumValue(hkey,(dword)num,str,NULL,&type,strv,&vl);
一运行,说变量有错,(我在vb6.0中使用可以,怎么在vc里却不下?)
请高手解答!!谢谢!
suc=::RegEnumValue(hkey, (dword)num, str, NULL, &type, strv, &vl);
{
static HKEY hLastKey = hKey;
LONG lResult;
DWORD dwIndex = 0;
HKEY hCurKey = hKey;
DWORD dwKeyType;
DWORD dwKeyDataLength, dwKeyNameLen;
LPBYTE pbbinKeyData = NULL;
TCHAR *tcKeyName = NULL;
TCHAR tcDataType[1024] = _T("");
lResult = RegOpenKeyEx(hCurKey, cstrKey, 0, KEY_QUERY_VALUE , &hKey);
if(lResult != ERROR_SUCCESS)
return;
DWORD lNoOfValues = 0;
DWORD lLongestKeyNameLen = 1;
DWORD lLongestDataLen = 1; lResult = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &lNoOfValues, &lLongestKeyNameLen, &lLongestDataLen,NULL, NULL); if(lResult != ERROR_SUCCESS)
return;
hLastKey = hKey;
lLongestKeyNameLen++;
lLongestDataLen++;
tcKeyName = new TCHAR[lLongestKeyNameLen];
pbbinKeyData = new BYTE[lLongestDataLen];
CString cstrFinalData, cstrTemp;
while(TRUE)
{
memset(pbbinKeyData, 0, lLongestDataLen);
memset(tcKeyName, 0, lLongestKeyNameLen);
dwKeyType = dwKeyDataLength = dwKeyNameLen = 0;
dwKeyNameLen = lLongestKeyNameLen;
dwKeyDataLength = lLongestDataLen;
lResult = RegEnumValue(hKey, dwIndex, tcKeyName, &dwKeyNameLen, NULL, &dwKeyType, pbbinKeyData, &dwKeyDataLength);
if(lResult == ERROR_NO_MORE_ITEMS)
break;
AddRegistryItem(tcKeyName, dwKeyType, pbbinKeyData, dwKeyDataLength, dwIndex);//显示数据于ListView
dwIndex++;
}
RegCloseKey(hKey);
delete tcKeyName;
delete pbbinKeyData;
}
long lresult=0;
char valuename[254];
dword dwcvaluename=254;
dword dwtype;
dword dwcount=254;
cstring data;
lresult=RegEnumValue(hkey,index,valuename,&dwcvaluename,null,&dwtype,null,&dwcount);
这是我自己用过的代码,没错!!!
chui168的可以运行!!
pomelowu(羽战士):编译时出错为:error C2018: unknown character '0xa1',有23个.
但vchui168运行时,查到index为5时,lresult就不能正确,index为4时,valuename的值,
即获取的项名少几个字母,
有那位好心的高手,帮帮忙,救我出水火,必有厚谢!!
我想搜索HKEY_CURRENT_USER\Control Panel\\desktop下的所有项名称,放在例表里,代码如下:
int index=0;
long lresult=0;
char valuename[254];
DWORD dwcvaluename=254;
CString data;
valuename[0]='\0';
DWORD dwtype;
DWORD dwcount =254;
::RegOpenKey(HKEY_CURRENT_USER,"Control Panel\\desktop",&hkey);
CListBox *pListBox=(CListBox*)GetDlgItem(IDC_LIST1);
do { lresult=RegEnumValue(hkey,index,valuename,&dwcvaluename,NULL,&dwtype,NULL,&dwcount);
pListBox->AddString(valuename);
index++;
}
while (lresult == ERROR_SUCCESS);
RegCloseKey(hkey);
}出现的现象是:查到index为5时,lresult就不能正确,index为4时,valuename的值,
即获取的项名少几个字母,
如果被搜索的项名称(valuename)是一个字母,或项的名称是文字"1"或"2"这样的,valuename就
是空的.
本人是初学者,有几点不明之处,请给予指点!
tcKeyName = new TCHAR[lLongestKeyNameLen];
pbbinKeyData = new BYTE[lLongestDataLen];
memset(pbbinKeyData, 0, lLongestDataLen);
memset(tcKeyName, 0, lLongestKeyNameLen);
尤其以上4句,是起什么作用???
这四个语句,前两个,开辟内存空间,用于保存Key的名字和数据,
后两句用来把刚才开辟的空间全部清零。