C++ 如何将COleVariant转换为CString c++;

C++ 如何将COleVariant转换为CString c++;,c++,mfc,C++,Mfc,我的MFC中有这个: CByteArray data; data.SetSize(9); data[0]='*'; data[1]=xG; data[2]=','; data[3]=yG; data[4]=','; data[5]=xL; data[6]=','; data[7]=yL; data[8]='#'; if(m_comm.get_PortOpen()){ //mscomm serial UpdateData(TRUE); m_comm.put_Output(COl

我的MFC中有这个:

CByteArray data;  data.SetSize(9);
data[0]='*';
data[1]=xG;
data[2]=',';
data[3]=yG;
data[4]=',';
data[5]=xL;
data[6]=',';
data[7]=yL;
data[8]='#';

if(m_comm.get_PortOpen()){ //mscomm serial
    UpdateData(TRUE);
    m_comm.put_Output(COleVariant(data));

    m_StrKirim=COleVariant(data);

    UpdateData(FALSE);
}
结果
m_StrKirim
与汉字idk相似

目标是将数据(数组)制作成一个字符串,并将其复制到
CString
变量中,然后将其显示到
m_StrKirim
(编辑控件)


我尝试了使用关键字
colevantial
CString
的教程,但它不起作用。

尽管
CString
有一个构造函数将
VARIANT
作为输入,但通过OLE将字节数组转换为
CString
没有多大意义

字节数组表示ASCII字符串,因此需要告诉
CString
将字节数组视为
char
字符串
CString
有一个构造函数,它接受
char*
和长度作为输入,并根据需要将
char
数据转换为
CString
的本机字符类型

试试这个:

m_StrKirim = CString(reinterpret_cast<char*>(data.GetData()), data.GetSize());
m_StrKirim=CString(reinterpret_cast(data.GetData()),data.GetSize());

注意,可以通过设置
\u CSTRING\u DISABLE\u show\u WIDE\u conversion
预处理器符号来禁用转换选择器。调用而不是使用神奇的值可能也是明智的。强制转换还应指定
char const*
作为其目标类型。@i关于
GetSize
的一个可检测的优点。不过,
const
cast不是必需的
data
不是
const
,可以将
char*
变量传递给
char const*
参数。没有明显的原因说明这不起作用,OleVariant可以将CByteArray转换为COM兼容的SAFEARRAY,这应该会让MSComm感到高兴。它不是字符串,您肯定不想用CString做任何事情。如果你看到“中文”,将二进制数据解释为Unicode字符串的典型结果,那么就认为这是一个问题,它是接收这个数据的代码或用什么工具来查看输出的问题。顺便说一句,删除对MSComm的依赖是明智的,因为它早已过期。