在一个按钮的OnClick事件里写的函数,功能是读取注册表中的值 : void Ctest1Dlg::OnBnClickedBtnRead()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();
HKEY hRootKey;
//取得根键
switch(m_nRootKey)
{
case 0:
hRootKey = HKEY_CLASSES_ROOT;
break;
case 1:
hRootKey = HKEY_CURRENT_CONFIG;
break;
case 2:
hRootKey = HKEY_CURRENT_USER;
break;
case 3:
hRootKey = HKEY_LOCAL_MACHINE;
break;
case 4:
hRootKey = HKEY_USERS;
break;
default:
return;
}
//打开指定的注册表中的键
HKEY hKey;
if( RegOpenKeyEx(hRootKey,
        m_strRegSubKey.GetBuffer(0),
        NULL,
        KEY_ALL_ACCESS,
        &hKey) != ERROR_SUCCESS )
return;
RegCloseKey(hRootKey); //读取指定键下的值
DWORD lValue = 512;
RegQueryValueEx(hKey,
                m_strKeyName.GetBuffer(0),
       NULL,
       NULL,
       (LPBYTE)m_strKeyValue.GetBuffer(0),
       &lValue);
UpdateData(false);
RegCloseKey(hKey);
}其中的“ m_ ”打头的变量都是定义的控件变量。当第一次执行时没问题,当第二次执行时,就在第一句UpDateData()时就会出错实在搞不懂,请大家指点一下。

解决方案 »

  1.   

    m_nRootKey 是不是在什么地方被修改,越界了,比如大于了 4
      

  2.   

    就在第一句UpDateData()时就会出错实在搞不懂~~
    那你确定是这句话出错还是下面的出错阿~~~
    你在下面添加一句AfxMessageBox()看看有没有弹出~~~
      

  3.   

    m_nRootKey 应该不会越界,他是由控件变化改变的。 
    我现在发现了一个问题是: m_strKeyValue 它是与一个CEdit控件关联。当我点击第一次时取得的注册表中的值 会显示到这个CEDIT控件上,把在界面上把他删除了,在执行这个button事件就没问题了,没有删除就会在第二次执行这个事件时 UpDateData()时报错
      

  4.   

    原来如此,你用 
    m_strKeyValue.GetBuffer(0) 得到CString的缓冲区后没有释放,再次DDX时缓冲区被锁定了,所以会出错。在你函数OnBnClickedBtnRead末尾加入
    m_strKeyValue.ReleaseBuffer();
      

  5.   

    SoLike(思危):我使用了你说的方法任然会出问题!! 我也估计是使m_strKeyValue.GetBuffer(0) 时出了问题。
     
    我写了一个简单的小程序。将界面上的两个CEdit控件的int变量相加。显示在第三个CEdit中, 开头调用UpDateData(),末尾调用UpDateData(FALSE).完全是没问题的。
    小弟是刚学VC不久,希望大家多我帮助