2010-12-22 47 views
0

我必须将C中的BSTR转换为CHAR *数据类型。有没有办法在不使用VC++库或函数的情况下执行此操作。代码必须在纯C中。我认为'comutil.h'具有函数,但它们是用C++编写的。将BSTR转换为CHAR *和CHAR *为C中的BSTR

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

感谢, sveerap

回答

0

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

事实上,BSTR类型是很好理解和记录。见here

它不超出可能的范围,你应该被禁止从使用任何微软BSTR操作功能,编写自己的BSTR操作功能的BSTRchar *之间进行转换的一些原因。

作为一个便宜而且非常讨厌的黑客,我现在已经将一个BSTR转换为char *,然后将每个备用字符复制到一个缓冲区或类似的地方。但是这并不能应付特殊字符,而且是非常非常讨厌的黑客攻击。除非你能保证BSTR中的字符都是标准的ASCII字符(或者不关心它们是否是这样),并且只是作为一种快速的调试黑客行事,或者只是作为一种谎言,而不是正确的产品优质的代码。

+0

感谢您的回复。我是visual studio 2008,但必须将其编译为纯c代码,因为此代码必须内置到一个dll中,该dll将与可与c模块进行通信的旧系统集成在一起 – sveerap 2010-12-22 13:38:09

2

你可以从char *到带有SysAllocStringByteLen()的BSTR。但是,如果char *仅包含ASCII字符,则不会发生字符转换。这不会造成问题将是非常罕见的。

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

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

+0

感谢您的回应。我使用了vC++中提供的comutil.h方法,并在dll中公开了C函数并将它们用作实用程序。它有效,但我不确定它是否是一种有效的方法 – sveerap 2010-12-24 02:02:10