写注册表乱码问题

lwhlx 2013-06-24 10:21:39
为什么写进去的是乱码:


当读取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;
...全文
287 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
橡木疙瘩 2013-06-24
  • 打赏
  • 举报
回复

    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,然后你的数据中的字符被两两合并了。
赵4老师 2013-06-24
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode:0x4A 0x55,UTF-8:0xE5 0x95 0x8A
lwhlx 2013-06-24
  • 打赏
  • 举报
回复
引用 2 楼 u010936098 的回复:

    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,然后你的数据中的字符被两两合并了。
搞错了,是二楼正解
lwhlx 2013-06-24
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode:0x4A 0x55,UTF-8:0xE5 0x95 0x8A
正解,万分感谢

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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