如何在 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 中声明宽字符常量的主要内容,如果未能解决你的问题,请参考以下文章
Long 指向常量宽字符串的指针,这里的 Long 的作用是啥?
JSON数据字符串拼接宽字符处理数组Notice警告isset和empty变量作用域常量include和require