VC2002和2005读写注册表是不是有区别,我同样的程序,可在VC2002里可以,取在VC2005不行?读写的出来的长度都不对.我用的RegQueryValueEx和RegSetValueEx

解决方案 »

  1.   

    没有不同,主义ANSI和UNICODE的区别
      

  2.   

    具体怎么区分?
    请帮我看看下边是需要变化,这个在VC2002可以,在VC2005读出来的长度就不对了///////////
    HKEY hKey;
    LONG nResult = 0;
    DWORD dwSize = 0;    // 数据长度TCHAR lpSubKey[] = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\K2cenGAD_is1");
    TCHAR lpValueName[] = _T("Inno Setup: App Path");///////////////nResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,    // 主键
        lpSubKey,    // 子键
        NULL,
        KEY_READ,    // 权限
        &hKey);        // Handleif( nResult != ERROR_SUCCESS )
    {
        
        return "";
    }///////////////////
    RegQueryValueEx(hKey,
        lpValueName,
        NULL,
        NULL,
        NULL,
        &dwSize);            // 缓冲区长度// 动态分配缓冲区
    LPBYTE dataBuf = new BYTE[dwSize];RegQueryValueEx(hKey,
        lpValueName,
        NULL,
        NULL,
        dataBuf,
        &dwSize);// 关闭
    RegCloseKey(hKey);CString str_owner=CString(dataBuf); 
    // 释放缓冲区
    delete[] dataBuf;
    return str_owner;
      

  3.   

    长度怎么不对?VC 2005默认是UNICODE的,也就是说返回的是UNICODE字符串,最后这个CString构造函数应该不对。
      

  4.   

    我这里是用UNICODE字符串,做的ARX程序
    应该怎样处理呢?我对这个不怎么明白,请大家帮帮忙哈,我这里读写都不对
      

  5.   

    朋友,问题出在CString str_owner=CString(dataBuf); 
    在VC2005中,默认是UNICODE,dataBuf获得的信息是正确的,但保存方式:比如"D:\"为 44 00 3A 00 5C 00,而CString(dataBuf),把44 后面的00当成中止符了,所以你的str_owner="D",就出错了.
    要改有两种办法.
    第一:CString str_owner; str_owner.Append((WCHAR*)dataBuf,dwSize);
    第二种...
    CString strPath;
    LONG lRet1 = RegQueryValueEx( hKey, lpValueName,NULL, NULL, (LPBYTE)strPath.GetBuffer( dwSize ), &dwSize );
    strPath.ReleaseBuffer();
    也行.
      

  6.   

    非常感谢bestoml ,非常感谢大家
    我现在明白了哈