读书人

写注册表乱码有关问题

发布时间: 2013-06-26 14:29:32 作者: rapoo

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

当读取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,然后你的数据中的字符被两两合并了。

读书人网 >C++

热点推荐