求助,VC MFC递归遍历注册表问题 本帖最后由 qq534888799 于 2011-12-01 08:01:13 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DWORD keylen = sizeof(subkey); //设置键实际长度改成 DWORD keylen = sizeof(subkey)+1; 不行,还是老问题,不过这次是在While循环里面做死循环不出来了 1.if(::RegOpenKeyEx(hkey,subkey,0,KEY_WRITE,&h_key) == ERROR_SUCCESS){EnumerateKeyE(h_key,subkey);这里的h_key已经是用subkey打开过的, 所以已经包含了subkey的路径,EnumerateKeyE(h_key,subkey) 就不对了2. ::RegEnumKeyEx(hkey,Index,subkey,&keylen,0,0,0,0) != ERROR_NO_MORE_ITEMSRegEnumKeyEx可能返回其他错误, 最好不要这么判断 BOOL GetComputerSetupSoftWareTxt(){ const int MAX_LEG = 256 * sizeof(TCHAR); HKEY hKey; DWORD dwRegNum = MAX_LEG; TCHAR regBufferName[MAX_LEG] = {0}; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"),NULL, KEY_READ, &hKey) == ERROR_SUCCESS ) { if(RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwRegNum, NULL, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { for(int i = 0; i < (int)dwRegNum; i++) { DWORD dwRegSize = MAX_LEG; RegEnumKeyEx(hKey, i, regBufferName, &dwRegSize, NULL, NULL, NULL, NULL); DWORD dwType; HKEY hSubKey; if( RegOpenKeyEx(hKey, regBufferName, NULL, KEY_READ, &hSubKey) == ERROR_SUCCESS) { TCHAR regBufferValue[MAX_LEG] = {0}; dwRegSize = MAX_LEG; RegQueryValueEx(hSubKey, _T("DisplayName"), 0, &dwType, (LPBYTE)regBufferValue, &dwRegSize); string displayName = regBufferValue; if(displayName == _T("")) { continue; } _tcscpy_s(regBufferValue, _T("")); RegQueryValueEx(hSubKey, _T("ParentKeyName"), 0, &dwType, (LPBYTE)regBufferValue, &dwRegSize); string softwareType = regBufferValue; } } } } else { return FALSE; //打开键失败 } RegCloseKey(hKey); return TRUE;} 1.if(::RegOpenKeyEx(hkey,subkey,0,KEY_WRITE,&h_key) == ERROR_SUCCESS){EnumerateKeyE(h_key,subkey);这里的h_key已经是用subkey打开过的, 所以已经包含了subkey的路径,EnumerateKeyE(h_key,subkey) 就不对了2. ::RegEnumKeyEx(hkey,Index,subkey,&keylen,0,0,0,0) != ERROR_NO_MORE_ITEMSRegEnumKeyEx可能返回其他错误, 最好不要这么判断 问编译出来的.lib没有导出函数的问题 如何使程序能兼容xp/vista/win7 如何实现不同的区域贴不同的图 问个基础的vc问题 求助:为何单选框组合映射到变量不起作用? 进程数、网络接收字节数、网络发送字节数 关于PC控制SCSI? 求助,在一台电脑上如何同时打开两个visual c++,在别的机器上是可以的? 关于 drag and drop(在线等待) 关于创建线程在win98蓝屏的现象 Static Text超链接下划线重绘背景透明的问题!!! 怎么取得工具栏内控件的句柄
改成 DWORD keylen = sizeof(subkey)+1;
if(::RegOpenKeyEx(hkey,subkey,0,KEY_WRITE,&h_key) == ERROR_SUCCESS)
{
EnumerateKeyE(h_key,subkey);这里的h_key已经是用subkey打开过的, 所以已经包含了subkey的路径,EnumerateKeyE(h_key,subkey) 就不对了
2. ::RegEnumKeyEx(hkey,Index,subkey,&keylen,0,0,0,0) != ERROR_NO_MORE_ITEMSRegEnumKeyEx可能返回其他错误, 最好不要这么判断
BOOL GetComputerSetupSoftWareTxt()
{
const int MAX_LEG = 256 * sizeof(TCHAR);
HKEY hKey;
DWORD dwRegNum = MAX_LEG;
TCHAR regBufferName[MAX_LEG] = {0};
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"),NULL, KEY_READ, &hKey) == ERROR_SUCCESS )
{
if(RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwRegNum, NULL, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
for(int i = 0; i < (int)dwRegNum; i++)
{
DWORD dwRegSize = MAX_LEG;
RegEnumKeyEx(hKey, i, regBufferName, &dwRegSize, NULL, NULL, NULL, NULL);
DWORD dwType;
HKEY hSubKey;
if( RegOpenKeyEx(hKey, regBufferName, NULL, KEY_READ, &hSubKey) == ERROR_SUCCESS)
{
TCHAR regBufferValue[MAX_LEG] = {0};
dwRegSize = MAX_LEG;
RegQueryValueEx(hSubKey, _T("DisplayName"), 0, &dwType, (LPBYTE)regBufferValue, &dwRegSize);
string displayName = regBufferValue;
if(displayName == _T(""))
{
continue;
}
_tcscpy_s(regBufferValue, _T(""));
RegQueryValueEx(hSubKey, _T("ParentKeyName"), 0, &dwType, (LPBYTE)regBufferValue, &dwRegSize);
string softwareType = regBufferValue;
}
}
}
}
else
{
return FALSE; //打开键失败
}
RegCloseKey(hKey);
return TRUE;
}
if(::RegOpenKeyEx(hkey,subkey,0,KEY_WRITE,&h_key) == ERROR_SUCCESS)
{
EnumerateKeyE(h_key,subkey);这里的h_key已经是用subkey打开过的, 所以已经包含了subkey的路径,EnumerateKeyE(h_key,subkey) 就不对了
2. ::RegEnumKeyEx(hkey,Index,subkey,&keylen,0,0,0,0) != ERROR_NO_MORE_ITEMSRegEnumKeyEx可能返回其他错误, 最好不要这么判断