LPBYTE    lpKeyValue2;
        
long ret2=::RegQueryValueEx( hKey, TEXT("address"), NULL,  
      &datatype, lpKeyValue2,  &cbBufferSize);            没有初始化指针,内存错误。改为:
char    lpKeyValue2[80];
        
long ret2=::RegQueryValueEx( hKey, TEXT("address"), NULL,  
      &datatype, &lpKeyValue2,  &cbBufferSize);            

解决方案 »

  1.   

    当时我的lpKeyValue1也没有初始化指针,为什么它通过了?对了用watch看,lpKeyValue2在该语句还未执行时,竟然和lpKeyValue1是同样的值。
      

  2.   

    这样申明的lpKeyValue存放在堆栈中,其初始值是随机的,如果碰巧它指向的内存区域本进程可以存取,它就可能执行成功,但它有可能破坏了进程本身的数据,不过暂时没有发现罢了。如果它指向的内存区域是无效的地址或本进程没有存取权限,则会出错。
    无论如何,这样没有初始化的指针是绝对不能出现的。
      

  3.   

    我把定义处改为:
    LPBYTE      lpKeyValue = new BYTE[80];
    ZeroMemory(lpKeyValue, 80);
    再在每次退出之前,加上
    delete [] lpKeyValue;
    可是每次到了delete [] lpKeyValue;时就会出现断言错!把[]删掉,改为
    delete lpKeyValue;就可以通过了。但是开始2,3次运行可以通过。可是后来就频繁报告无法读出原来的address值。非常疑惑。
    1。为什么加上[]不行。它不是个char[80]的数组吗?   
    2。为什么有时可以成功运行,有时候不行?另外全部按照plato(天天)的方法把定义改为:char lpKeyValue[80];
    无论给原来的参数加不加&,都会报告类型不符合的错,无法通过编译。那位能试着改改或者运行一下程序。
    要解决的问题很简单。就是一开始去读注册表某个位置的键值,如果有就读取,没有就创建。然后在对话框退出之前,把从EDIT框中的数在写入到注册表指定位置。
      

  4.   

    我疏忽了:强行转换指针:(LPBYTE)(&lpKeyValue)另外全部按照plato(天天)的方法把定义改为:char lpKeyValue[80];
    无论给原来的参数加不加&,都会报告类型不符合的错,无法通过编译。
      

  5.   

    delete [] lpKeyValue出错的问题:
    是不是其它地方产生的内存错,仔细检查,这段程序单独运行应该没有问题。
      

  6.   

    多谢plato(天天)的耐心解答,编译执行没有问题。可是还是读取第二个address出错,读取第一个name信息没有任何问题。
    我把第二个RegQueryValueEx()给注释掉以后,程序非常稳定,什么问题都没有。奇怪了。shame。如果那位热心兄弟愿意给我看看,我可以发一个简单试验程序的源码供您斧正,赐教。多谢多谢。