Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中将BSTR转换为CHAR*并将CHAR*转换为BSTR_C_Com - Fatal编程技术网

在C中将BSTR转换为CHAR*并将CHAR*转换为BSTR

在C中将BSTR转换为CHAR*并将CHAR*转换为BSTR,c,com,C,Com,我必须在C中将BSTR转换为CHAR*数据类型。在不使用VC++库或函数的情况下,是否仍然可以这样做。代码必须是纯C.,我想“CUTUTIL .H”已经有函数,但它们是C++的。 另外,关于SysAllocString函数,我们可以在C中使用它并将其转换为CHAR*?。请帮忙 谢谢, sveerap这取决于您如何定义“VC++库或函数”。BSTR类型几乎是一种VC++类型。但是,如果您认为它是“Windows”类型,那么在“Windows”库和“Windows”函数中可以使用BSTR操作函数。这

我必须在C中将BSTR转换为CHAR*数据类型。在不使用VC++库或函数的情况下,是否仍然可以这样做。代码必须是纯C.,我想“CUTUTIL .H”已经有函数,但它们是C++的。 另外,关于SysAllocString函数,我们可以在C中使用它并将其转换为CHAR*?。请帮忙

谢谢, sveerap

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

事实上,BSTR类型已被很好地理解和记录。看

如果出于某种原因不允许您使用任何Microsoft BSTR操纵函数,您可以编写自己的BSTR操纵函数,在
BSTR
char*
之间进行转换


作为一个廉价且非常讨厌的黑客,我之前已经将BSTR转换为char*,然后将每个备用字符复制到缓冲区或类似位置。然而,这并不适用于特殊角色,这是一个非常讨厌的黑客行为。请不要这样做,除非您可以保证BSTR中的字符都是标准ASCII字符(或者不管它们是否是),并且只是作为一种快速调试或类似的东西,而不是正确的生产质量代码。您可以使用SysAllocStringByteLen()从字符*转到BSTR。但这只有在char*只包含ASCII字符时才安全,不会发生字符转换。这不会引起问题的情况非常罕见

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


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

感谢您的回复。我是visual studio 2008,但必须将其编译为纯c代码,因为此代码必须构建到dll中,该dll将与旧式系统集成,该系统只能与c模块对话以获得响应。我使用了vc++中可用的comutil.h方法,并在dll中将它们公开为C函数,并将它们用作实用程序。它是有效的,但我不确定它是否是一种有效的方法