WCHAR和char相互转换的问题

带着心去流浪 2015-12-22 09:16:32
下面是定义的结构体:
typedef struct tagSERIALDATA
{
CHAR serialData[10];
INT serialDataLength;
}SERIALDATA,*PSERIALDATA;


if (28 == pCopyDataStruct->dwData)
{

if (pCopyDataStruct->cbData == 0 || NULL == pCopyDataStruct->lpData)
{
return FALSE;
}
nuMemset(&s_SerialData,0,sizeof(s_SerialData));
nuMemcpy(&s_SerialData,pCopyDataStruct->lpData,sizeof(s_SerialData));


NURO_UI_MESSAGE nrMsg = {0};
nrMsg.nMsgID = _MSG_HS_TO_NAVI_SERIALDATA_;
nrMsg.nParam1 = (DWORD)&s_SerialData;

if (0 != nrMsg.nMsgID)
{
m_LoadCallmgr.Message(nrMsg);
}
return TRUE;
}
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}

同事定义的结构体也是char类型的,但是后面的函数我要用到wchar类型,所以在下面的函数中做了如下的转化:
nuUINT CNLCViewVersionDlgJP::nSetVersionText()
{
//#ifdef VALUE_EMGRT
nuWcscpy(m_NR_VERSION.wKernelVer, s_pNchStringJP->wGetString(_STR_KERNEL_VERSION_));
//#else
//nuWcscpy(m_NR_VERSION.wKernelVer, (nuWCHAR *)_NR_KERNEL_VERSION_);
//#endif
#ifdef VALUE_EMGRT
nuWcscpy(m_NR_VERSION.wMapVer, s_pNchStringJP->wGetString(_STR_MAP_VERSION_));
#endif
nuWcscpy(m_NR_VERSION.wMapSource, s_pNchStringJP->wGetString(_STR_MAP_SOURCE_));
nuWcscpy(m_wVerNum,s_pNchStringJP->wGetString(_STR_VERSION_NUMBER_));

vSetObjectText(_ID_STATIC_KERNEL_VER_, m_NR_VERSION.wKernelVer);
vSetObjectText(_ID_STATIC_MAP_VER_, m_NR_VERSION.wMapVer);
vSetObjectText(_ID_STATIC_MAP_SOURCE_, m_NR_VERSION.wMapSource);
vSetObjectText(_ID_STATIC_VER_NUMBER_,m_wVerNum);

vSetObjectText(_ID_STATIC_OS_VER_, s_stcMainCtrlVer.wOS);
vSetObjectText(_ID_STATIC_SINGLECHIP_VER_, s_stcMainCtrlVer.wSingleChip);
vSetObjectText(_ID_STATIC_HARDWARE_VER_, s_stcMainCtrlVer.wHardWare);
vSetObjectText(_ID_STATIC_MAINCTRL_VER_,s_stcMainCtrlVer.wMainCtrl);
vSetObjectText(_ID_STATIC_MAINCTRL_UID_,CGnBaseDlg::s_wHSMacUID);

1:这是第一种方法:
int numChar = ::MultiByteToWideChar(0,0,s_stcSerialData.serialData,-1,NULL,0);
nuWCHAR *b = (nuWCHAR*)malloc(numChar*sizeof(nuWCHAR));
::MultiByteToWideChar(0,0,s_stcSerialData.serialData,-1,b,numChar);
vSetObjectText(_ID_STATIC_SERIALDATA_,b);
free(b);
2:这是第二种:
// vSetObjectText(_ID_STATIC_SERIALDATA_,(nuWCHAR*)s_stcSerialData.serialData);

3:这是第三种:
// nuWCHAR SerialData[10];
// nuAsctoWcs(SerialData,10,s_stcSerialData.serialData,10);
// vSetObjectText(_ID_STATIC_SERIALDATA_,SerialData);


// /*= TEXT("1234567")*/;
nuMemset(wsimdata,NULL,sizeof(wsimdata));
//nuAsctoWcs(wsimdata,20,s_stcSimNum.simdata,20);
//vSetObjectText(_ID_STATIC_SIM_NUMBER_,/*TEXT("1234567")*/wsimdata);

return 1;
}

但是第一种和第三种,得到的确实乱码的结果,第二种报错误

下面贴同事的代码:

typedef struct tagSerialData
{
CHAR serialdata[10];
int serialDataLength;
}SERIALDATA, *PSERIALDATA;



void CHangShengMsgTestDlg::OnBnClickedButton6()
{
HWND hNavi = NULL;
hNavi = ::FindWindow(NULL,TEXT("guider"));
if (hNavi == NULL)
{
return ;
}
memset(&m_SerialData,0,sizeof(m_SerialData));
m_SerialData.serialDataLength = strlen("2591JKN600");
strcpy(m_SerialData.serialdata,"2591JKN600");


COPYDATASTRUCT SerialDataCopyData = {0};
SerialDataCopyData.dwData = 28;
SerialDataCopyData.cbData = sizeof(m_SerialData);
SerialDataCopyData.lpData = &m_SerialData;

::SendMessage(hNavi,WM_COPYDATA,0,(LPARAM)&SerialDataCopyData);
}
...全文
784 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
带着心去流浪 2015-12-24
  • 打赏
  • 举报
回复
引用 6 楼 91program 的回复:
你将 Unicode 字符串写入文件,有没有在文件的开始写入 Unicode 标志,好像是 0xfffe?
不是那个问题,我已经解决了,谢谢
91program 2015-12-23
  • 打赏
  • 举报
回复
你将 Unicode 字符串写入文件,有没有在文件的开始写入 Unicode 标志,好像是 0xfffe?
带着心去流浪 2015-12-23
  • 打赏
  • 举报
回复
引用 4 楼 qq_27922603 的回复:
[quote=引用 3 楼 91program 的回复:]
[quote=引用 2 楼 qq_27922603 的回复:]
[quote=引用 1 楼 91program 的回复:]
MultiByteToWideChar 请正确设置第一个参数


引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数



我接受过来的是数字和字母的组合,然后有两个MultiByteToWideChar ,是在不懂怎么设置第一个参数[/quote]

不懂没关系,可以查 MSDN。
或者,直接网上查找,有很多现成的代码可以参考 。[/quote]


// int len = strlen(s_stcSerialData.serialData);
// int numChar = ::MultiByteToWideChar( CP_ACP,0,s_stcSerialData.serialData,-1,NULL,0);
//
// nuWCHAR *b = new nuWCHAR[numChar+1];
// nuMemset(b,0,(numChar+1)*sizeof(nuWCHAR));
// ::MultiByteToWideChar(CP_ACP,0,s_stcSerialData.serialData,-1,(LPWSTR)b,numChar);
// wstring rt;
// rt = (nuWCHAR *)b;
//
// vSetObjectText(_ID_STATIC_SERIALDATA_,rt);
// delete b;


从网上看的,但是写到到文件里的还是乱码
[/quote]
带着心去流浪 2015-12-23
  • 打赏
  • 举报
回复
引用 3 楼 91program 的回复:
[quote=引用 2 楼 qq_27922603 的回复:] [quote=引用 1 楼 91program 的回复:] MultiByteToWideChar 请正确设置第一个参数
引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数
我接受过来的是数字和字母的组合,然后有两个MultiByteToWideChar ,是在不懂怎么设置第一个参数[/quote] 不懂没关系,可以查 MSDN。 或者,直接网上查找,有很多现成的代码可以参考 。[/quote] // int len = strlen(s_stcSerialData.serialData); // int numChar = ::MultiByteToWideChar( CP_ACP,0,s_stcSerialData.serialData,-1,NULL,0); // // nuWCHAR *b = new nuWCHAR[numChar+1]; // nuMemset(b,0,(numChar+1)*sizeof(nuWCHAR)); // ::MultiByteToWideChar(CP_ACP,0,s_stcSerialData.serialData,-1,(LPWSTR)b,numChar); // wstring rt; // rt = (nuWCHAR *)b; // // vSetObjectText(_ID_STATIC_SERIALDATA_,rt); // delete b; 从网上看的,但是写到到文件里的还是乱码
91program 2015-12-23
  • 打赏
  • 举报
回复
引用 2 楼 qq_27922603 的回复:
[quote=引用 1 楼 91program 的回复:] MultiByteToWideChar 请正确设置第一个参数
引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数
我接受过来的是数字和字母的组合,然后有两个MultiByteToWideChar ,是在不懂怎么设置第一个参数[/quote] 不懂没关系,可以查 MSDN。 或者,直接网上查找,有很多现成的代码可以参考 。
带着心去流浪 2015-12-23
  • 打赏
  • 举报
回复
引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数
引用 1 楼 91program 的回复:
MultiByteToWideChar 请正确设置第一个参数
我接受过来的是数字和字母的组合,然后有两个MultiByteToWideChar ,是在不懂怎么设置第一个参数
91program 2015-12-23
  • 打赏
  • 举报
回复
MultiByteToWideChar 请正确设置第一个参数

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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