none
RegOpenKeyEx在Windows Server 2008获取注册表信息异常 RRS feed

  • 问题

  • 如下代码以VC6编译,在XP和2003中运行正常

    1. CString dataStr("");

    2. DWORD dataSize=512;

    3. error=::RegQueryValueEx(hItem,lpValueName,NULL,NULL,(LPBYTE)(LPCSTR)dataStr,&dataSize);

    4. AfxMessageBox("Path: "+dataStr);

    在Windows Server2008使用Visual Studio 2005 SP1编译仍然成功,运行时却产生异常。执行完行3后,debug显示dataStr获取了正确的值,但是在行4显示时抛出Access violation writing location

    对上述代码做如下更改,使用char 数组返回结果,无论是debug还是运行都执行正确。

    1. unsigned char chbuf[512];

    2. CString path;

    3. error=::RegQueryValueEx(hItem,lpValueName,NULL,NULL,chbuf,&dataSize);

    4. path.Format("%s", chbuf);

    5. AfxMessageBox("Path: "+path);

    我的问题是,从vista开始,到底是下面的哪一项的更改导致了上述老代码运行在新系统中抛出异常

    (1)LPCSTR/CSting;

    (2)RegQueryValueEx API

    (3)VC6/Visual Studio 2005 SP1

    谢谢!

    • 已编辑 Eazhang 2010年12月14日 3:49 编辑界面
    2010年12月14日 3:43

答案

  • 1 你只能设置一个很大的buffer去保存注册表获得的值

    2 我没有研究CString在VC6到VS2005的变化。

    可能是由于实现变化了。也有可能是编译器越界检查变化了。


    麻烦把正确答案设为解答。
    • 已标记为答案 Eazhang 2010年12月15日 9:55
    2010年12月15日 3:55
    版主

全部回复

  • (1)LPCSTR/CSting

    RegQueryValueEx需要传入一个已经分配好空间的指针。

    而你把CString强转成char*后,指向的是该CString中预分配的空间。而这个空间可能不足以保存返回值。你原来的做法就不正确。


    麻烦把正确答案设为解答。
    2010年12月14日 5:29
    版主
  • 原来的代码使用VC6编译的,在XP运行没有问题能获得正确的路径,但是在Windows Server 2008下用VS2005运行不正确。

    对于您的“这个空间可能不足以保存返回值”,确实是的,我与预分配多大,那么Cstring根据大小返回相应长度的字串。

     

    那我的问题又变成了:

    (1)为何在debug窗口中是可以看到修改后的值呢,无论我对Cstring大小的预先设置?

    (2)为何VC6/XP中能够正确执行?难不成CString或者内存的分配原理有变化?

     

    谢谢!

     

    2010年12月14日 5:48
  • 1 你只能设置一个很大的buffer去保存注册表获得的值

    2 我没有研究CString在VC6到VS2005的变化。

    可能是由于实现变化了。也有可能是编译器越界检查变化了。


    麻烦把正确答案设为解答。
    • 已标记为答案 Eazhang 2010年12月15日 9:55
    2010年12月15日 3:55
    版主