紧急!帮我看看为什么第一步通过,第二步就不能通过呢?(注册表相关)附源代码。

hillfree 2001-06-28 11:03:48
写了一个从注册表读数据的程序。如果该键值不存在就创建之。如果存在就读取之。
问题是读取的时候,第一步读取name都是正常的,但是读取address的时候,RegQueryValueEx就返回错误。

各位兄弟,帮我看看程序。看看那里出错或者用错了。十分感谢。(比较着急)




BOOL CTryregDlg::GetRegInfo(CString &strOne, CString &strTwo)
{
HKEY hKey;
LPCTSTR lpPath="Software\\CSCW\\TmVconf\\TmStar\\";

DWORD dwDisposition=REG_CREATED_NEW_KEY;
long ret0 = RegCreateKeyEx( HKEY_LOCAL_MACHINE, lpPath, 0,
NULL,REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
NULL, &hKey, &dwDisposition);

if(ret0!=ERROR_SUCCESS)
{
TRACE0(_T("第一步:打开或者创建就失败了。\n"));
return FALSE;
}

if ( dwDisposition == REG_CREATED_NEW_KEY)
{
LPBYTE lpKeyValue;
DWORD cbBufferSize=80;
lpKeyValue = (unsigned char *)"";

long ret1 = RegSetValueEx(hKey, TEXT("name"), 0,
REG_SZ, lpKeyValue, cbBufferSize);
if (ret1 != ERROR_SUCCESS) {
TRACE0(_T("不行呀,我创建不了name这个键值。\n"));
RegCloseKey(hKey);
return FALSE; }

long ret2 = RegSetValueEx(hKey, TEXT("address"), 0,
REG_SZ, lpKeyValue, cbBufferSize);
if (ret2 != ERROR_SUCCESS) {
TRACE0(_T("不行呀,我创建不了address这个键值。\n"));
RegCloseKey(hKey);
return FALSE; }

RegCloseKey(hKey);
return FALSE;
}
else
{
LPBYTE lpKeyValue1;
DWORD datatype=REG_SZ ;
DWORD cbBufferSize=80;

long ret1 =::RegQueryValueEx( hKey, TEXT("name"), NULL,
&datatype, lpKeyValue1, &cbBufferSize);

if(ret1 != ERROR_SUCCESS)
{
MessageBox("错误: 无法查询有关注册表name信息!\n");
::RegCloseKey(hKey);
return false;
}

LPBYTE lpKeyValue2;

long ret2=::RegQueryValueEx( hKey, TEXT("address"), NULL,
&datatype, lpKeyValue2, &cbBufferSize);

if(ret2!=ERROR_SUCCESS)
{
MessageBox("错误: 无法查询有关注册表address信息!\n");
::RegCloseKey(hKey);
return false;
}

strOne = CString(lpKeyValue1);
strTwo = CString(lpKeyValue2);


::RegCloseKey(hKey);
return true;
}

}
...全文
139 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
plato 2001-06-28
  • 打赏
  • 举报
回复
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);
hillfree 2001-06-28
  • 打赏
  • 举报
回复
关注,感谢大家提出意见。
hillfree 2001-06-28
  • 打赏
  • 举报
回复
多谢plato(天天)的耐心解答,编译执行没有问题。可是还是读取第二个address出错,读取第一个name信息没有任何问题。
我把第二个RegQueryValueEx()给注释掉以后,程序非常稳定,什么问题都没有。奇怪了。shame。

如果那位热心兄弟愿意给我看看,我可以发一个简单试验程序的源码供您斧正,赐教。多谢多谢。
plato 2001-06-28
  • 打赏
  • 举报
回复
delete [] lpKeyValue出错的问题:
是不是其它地方产生的内存错,仔细检查,这段程序单独运行应该没有问题。
plato 2001-06-28
  • 打赏
  • 举报
回复
我疏忽了:强行转换指针:(LPBYTE)(&lpKeyValue)

另外全部按照plato(天天)的方法把定义改为:char lpKeyValue[80];
无论给原来的参数加不加&,都会报告类型不符合的错,无法通过编译。
hillfree 2001-06-28
  • 打赏
  • 举报
回复
敬请指导。多谢多谢!!
hillfree 2001-06-28
  • 打赏
  • 举报
回复
我把定义处改为:
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框中的数在写入到注册表指定位置。
xxxbird 2001-06-28
  • 打赏
  • 举报
回复
这样申明的lpKeyValue存放在堆栈中,其初始值是随机的,如果碰巧它指向的内存区域本进程可以存取,它就可能执行成功,但它有可能破坏了进程本身的数据,不过暂时没有发现罢了。如果它指向的内存区域是无效的地址或本进程没有存取权限,则会出错。
无论如何,这样没有初始化的指针是绝对不能出现的。
hillfree 2001-06-28
  • 打赏
  • 举报
回复
当时我的lpKeyValue1也没有初始化指针,为什么它通过了?对了用watch看,lpKeyValue2在该语句还未执行时,竟然和lpKeyValue1是同样的值。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧