我们正在将我们的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”;
答案 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有效,那么各种各样也应该有效。