首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

写注册表乱码有关问题

2013-06-26 
写注册表乱码问题为什么写进去的是乱码:当读取Version时又是真确的,但读取path却是错误的指针求各位大虾指

写注册表乱码问题
为什么写进去的是乱码:
写注册表乱码有关问题

当读取Version时又是真确的,但读取path却是错误的指针
求各位大虾指点

HKEY hAppKey;
    DWORD dwDisposition = MAX_PATH*sizeof(TCHAR);
    LPCTSTR lpcKey = _T("SOFTWARE\\00TEST");
    LPCTSTR lpcKeyVesrsion = _T("version");
    LPCTSTR lpcKeyPath = _T("path");
    LPBYTE lpbDataPath;
    LPBYTE lpbDataVersion;
    int nVersionLen;
    int nPathLen;
    UINT nErrorCode;

    CString Version = _T("0.0.0.1");
    nVersionLen = Version.GetLength();
    lpbDataVersion = new BYTE[nVersionLen+1];
    for(int i=0; i<nVersionLen; i++) {
        lpbDataVersion[i] = Version[i];
    }
    lpbDataVersion[nVersionLen] = '\0';

    CString Path = _T("C:\\Program Files\\test");
    nPathLen = Path.GetLength();
    lpbDataPath = new BYTE[nPathLen+1];
    for(int i=0; i<nPathLen; i++) {
        lpbDataPath[i] = Path[i];
    }
    lpbDataPath[nPathLen] = '\0';

    if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, lpcKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,&hAppKey, &dwDisposition)) {
        TRACE("RegCreateKeyEx failed!\n");
        return false;
    }
    else {
        if (ERROR_SUCCESS != RegSetValueEx (hAppKey, lpcKeyVesrsion, 0, REG_SZ, lpbDataVersion, nVersionLen+1)) {
            TRACE("RegSetValueEx Version failed!\n");
            return false;
        }
        if (ERROR_SUCCESS != RegSetValueEx (hAppKey, lpcKeyPath, 0, REG_SZ, lpbDataPath, nPathLen+1)) {
            TRACE("RegSetValueEx Path failed!\n");
            return false;
        }
        RegCloseKey (hAppKey);
    }

    return true;

[解决办法]
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode:0x4A 0x55,UTF-8:0xE5 0x95 0x8A



[解决办法]


    TCHAR* lpbDataPath;
    TCHAR* lpbDataVersion;

        if (ERROR_SUCCESS != RegSetValueEx (hAppKey, lpcKeyVesrsion, 0, REG_SZ, (LPBYTE)lpbDataVersion, nVersionLen+1)) {
            TRACE("RegSetValueEx Version failed!\n");
            return false;
        }
        if (ERROR_SUCCESS != RegSetValueEx (hAppKey, lpcKeyPath, 0, REG_SZ, (LPBYTE)lpbDataPath, nPathLen+1)) {
            TRACE("RegSetValueEx Path failed!\n");
            return false;
        }


RegSetValueEx是支持Unicode编码的,不要被参数声明中的那个LPBYTE蒙骗了,当你的工程是以UNICODE模式编译时,真正调用的是RegSetValueExW,而这个函数在处理REG_SZ时,会把lpData解释为LPWSTR,然后你的数据中的字符被两两合并了。

热点排行