如何在IDL中声明宽字符常量

时间:2009-08-23 07:58:56

标签: c++ string unicode const idl

我们正在将我们的C ++ COM应用程序迁移为unicode,并且作为此迁移的一部分,我们还希望将IDL中的常量字符串迁移到unicode。

问题在于,目前我们仍然在ANSI和UNICODE中编译它,这意味着我们不能使用L“String”构造来声明宽图。

目前,我们的字符串常量定义如下:

const LPSTR STRING_CONST_NAME =“STRING VALUE”;

我们想要像这样定义:

const LP T STR STRING_CONST_NAME =“STRING VALUE”;

如果它是常规代码,我们只需添加_T(“STRING VALUE”)宏,当在unicode中编译时,它会将其转换为L“STRING VALUE”

但是从我所看到的,我们不能在IDL中使用它,因为_T是一个纯粹的C ++构造。

我们的方法是否正确?也许我们应该这样定义它,无论如何:

const LP T STR STRING_CONST_NAME = L “STRING VALUE”;

2 个答案:

答案 0 :(得分:2)

我想知道为什么你需要在IDL文件中有字符串常量。将它们放在头文件中是否足够?我看到Microsoft只在sapiaut.idl中有广泛的字符串文字(查看所有平台SDK IDL文件);由于这些少数常量从未使用过,这也可能是一个错误。另请注意,这些常量定义为BSTR

如果你想在IDL文件中使用它们,cpp_quote它们就足够了。

如果您绝对希望它们在IDL中,您可以使用#ifdef来定义两个不同的定义。在这种情况下,您还应该有两个不同的类型库,具有单独的接口集,具有不同的UUID,依此类推。

答案 1 :(得分:0)

如果它应该始终是Unicode,那么使用“T”构造是没有用的 - 只是这样做;

  const LPCWSTR STRING_CONST_NAME = L"STRING VALUE";

“W”代表“宽” -

不确定Windows定义的LPC * STR typedef如何与IDL相互作用,但如果LPSTR有效,那么各种各样也应该有效。