Visual c++ 如何将BSTR字符串转换为无符号字符(在appln中使用com技术)

Visual c++ 如何将BSTR字符串转换为无符号字符(在appln中使用com技术),visual-c++,com,Visual C++,Com,我正在编写使用com技术的小应用程序。我想将BSTR字符串转换为无符号字符。为此,我使用W2A()宏将BSTR转换为字符串,然后将String.C_STR()复制到一个无符号字符数组。代码片段如下所示: Send(BSTR *packet, int length) { std::string strPacket = W2A(*packet); unsigned char * pBuffer = new unsigned char [strPacket.length()+1]

我正在编写使用com技术的小应用程序。我想将BSTR字符串转换为无符号字符。为此,我使用W2A()宏将BSTR转换为字符串,然后将String.C_STR()复制到一个无符号字符数组。代码片段如下所示:

Send(BSTR *packet, int length)
{ 
     std::string strPacket = W2A(*packet);
     unsigned char * pBuffer = new unsigned char [strPacket.length()+1];
     memset(pBuffer,0,strPacket.length()+1); 
     memcpy(pBuffer,strPacket.c_str(),strPacket.length()+1);
}
当数据包包含普通字符串时,这种方法可以正常工作。但如果数据包中包含NUL字符,则会出现问题。一些未知字符出现在pBuffer中的NUL之后,即转换后


有人能告诉我如何避免吗?或者有没有其他正确的方法

BSTR是Windows API类型,必须使用API宏或函数进行管理。如果您无法使用W2A宏,因为您的字符串中可能包含空字符,则必须使用WideChartMultiByte函数,该函数可以将BSTR的宽字符转换为字符*的窄字符。确保有SDK文档。或者,您可以让您的程序使用WCHARs

W2A需要一个以空结尾的字符串,因此它将忽略该空字符以外的所有内容,因此您永远不会得到任何未知字符。@sharptooth谢谢。有没有其他方法或函数可以保留空字符之后的所有内容,我可以用它代替W2A。我希望即使字符串中存在NUL,转换也能正确进行。与C字符串不同,BSTR可以包含嵌入的零。这使得存储字节数组而不是字符串常常被滥用。它已经有了一个合适的COM自动化类型,即SAFEARRAY。但如果它实际上是一个字节数组,那么从Unicode到ANSI的转换就没有意义了。如果它包含一个单字节0,那么它将严重失败,因为在转换例程中它看起来像一个汉字。需要在代码中准确地了解缓冲区的结构以及实际存储字符串的部分。