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

Posted

技术标签:

【中文标题】如何在 IDL 中声明宽字符常量【英文标题】:How to declate a wide char constant in an IDL 【发布时间】:2009-08-23 07:58:56 【问题描述】:

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

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

目前,我们的字符串常量是这样定义的:

const LPSTR STRING_CONST_NAME = "STRING VALUE";

我们想这样定义它:

const LPTSTR STRING_CONST_NAME = "STRING VALUE";

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

但据我所知,我们不能在 IDL 中使用它,因为 _T 是纯 C++ 构造。

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

const LPTSTR STRING_CONST_NAME = L"STRING VALUE";

【问题讨论】:

【参考方案1】:

我想知道为什么您需要在 IDL 文件中包含字符串常量。将它们放在头文件中还不够吗?我看到微软仅在 sapiaut.idl 中具有宽字符串文字(查看所有平台 SDK IDL 文件);由于从未使用过这几个常量,这也可能是一个错误。另请注意,这些常量定义为BSTR

如果您希望它们在 IDL 文件中,则 cpp_quote 可能就足够了。

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

【讨论】:

我们将它们定义为 const,因为我们稍后会在 API 的其他地方使用它们。我们的许多 API 方法都接受这些字符串作为参数,并且更容易在 COM api 中定义它们一次,然后在它的所有客户端中使用它们。我会检查你关于将它们定义为 BSTR 的观点,这可能是我们从一开始就犯的错误。 我认为将它们定义为 BSTR 是一个错误——BSTR 必须使用 SysAllocString 分配。文字宽字符字符串不是有效的 BSTR,因为它们不能以长度为前缀。【参考方案2】:

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

  const LPCWSTR STRING_CONST_NAME = L"STRING VALUE";

“W”代表“宽”-

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

【讨论】:

以上是关于如何在 IDL 中声明宽字符常量的主要内容,如果未能解决你的问题,请参考以下文章

将字符串宏/常量转换为宽字符/Unicode

Long 指向常量宽字符串的指针,这里的 Long 的作用是啥?

JSON数据字符串拼接宽字符处理数组Notice警告isset和empty变量作用域常量include和require

如何在 IntelliJ 中更改线宽(从 120 个字符开始)

如何摆脱`打印中的宽字符`?

如何消除 TT 的“打印中的宽字符”警告?