将BSTR转换为CHAR *,将CHAR *转换为C中的BSTR

时间:2010-12-22 12:04:13

标签: c com

我必须在BS中将BSTR转换为CHAR *数据类型。无论如何都要在不使用VC ++库或函数的情况下执行此操作。代码必须是纯粹的C.我认为'comutil.h'有函数,但我认为它们是C ++。

另外,关于SysAllocString函数,我们可以在C中使用它并转换为CHAR *吗?请帮忙。

谢谢, sveerap

2 个答案:

答案 0 :(得分:2)

您可以使用SysAllocStringByteLen()从char *转到BSTR。但是,如果char *仅包含ASCII字符,则不会发生字符转换。这不会导致问题非常罕见。

下一跳是MultiByteToWideChar(),您通常希望将CodePage参数设置为CP_ACP,除非您知道该字符串是以另一种方式编码的。这会生成一个宽字符串,然后您可以将其传递给SysAllocString()以获取BSTR。

另一种方法是WideCharToMultiByte(),直接传递BSTR将起作用,除非它包含嵌入的0个字符。但是,无论如何转换都是有损的,请注意当您使用包含重音字符的字符串或者在您使用的代码页中无法表示的任何其他字符串时,这可能会导致相当严重的问题。

答案 1 :(得分:0)

这取决于您如何定义“VC ++库或函数”。 BSTR类型几乎是VC ++类型。但是,如果您认为它是“Windows”类型,则可以使用“Windows”库中的BSTR操作函数和“Windows”函数。这完全取决于您正在做什么,您正在使用什么编译器,以及任何其他技术限制。在这个问题中描述为什么你不能使用VC ++库是个好主意。

事实上,BSTR类型已被很好地理解和记录。请参阅here

如果您因为某些原因因使用任何Microsoft BSTR操作函数而被禁止,编写您自己的BSTR操作函数以在BSTR和{{1之间进行转换],则不会超出可能性范围。 }}

作为一个廉价且非常讨厌的黑客,我之前已经将BSTR转换为char *,然后将每个替换字符复制到缓冲区或类似字符。然而,这不适应特殊字符,是一个非常讨厌的黑客。请不要这样做,除非你可以保证BSTR中的字符都是标准的ASCII字符(或者不关心它们是不是)并且只是作为快速调试hack或者其他东西而不是正确生产质量代码。