2009-08-23 33 views
0

我們正在將我們的C++ COM應用程序遷移爲unicode,並且作爲此遷移的一部分,我們還希望將IDL中的常量字符串遷移到unicode。如何在IDL中減少寬字符常量

問題是,目前我們仍然使用ANSI和UNICODE編譯它,這意味着我們不能使用L「String」構造來聲明寬圖表。

目前,我們的字符串常量定義是這樣的:

常量LPSTR STRING_CONST_NAME = 「字符串值」;

我們要定義這樣的:

常量LP 牛逼 STR STRING_CONST_NAME = 「字符串值」;

如果它是常規代碼中的Unicode

但是從編譯時,我們只需添加_T(「字符串值」)宏這將它轉換爲L「字符串值」我所看到的,我們可以」不要在IDL中使用它,因爲_T是一個純粹的C++構造。

我們的方法是否正確?可能是我們應該把它定義這樣不管是什麼:

常量LP 牛逼 STR STRING_CONST_NAME = 大號「字符串值」;

回答

2

我想知道爲什麼你需要IDL文件中的字符串常量。將它們放在頭文件中是不夠的嗎?我發現微軟只有在sapiaut.idl中才有廣泛的字符串文字(查看所有平臺SDK IDL文件);因爲從未使用這些常量,這也可能是一個錯誤。另請注意,這些常量被定義爲BSTR

如果您希望它們位於IDL文件中,那麼可以用cpp_引用它們。

如果你確實希望他們在IDL中字面上,你可以使用#ifdef有兩個不同的定義。在這種情況下,您還應該有兩個不同的類型庫,分別具有不同的接口集合,不同的UUID等等。

+0

我們將它們定義爲const,因爲我們稍後在API的其他地方使用它們。 我們的許多API方法接受這些字符串作爲參數,並且在COM api中定義它們更容易一些,並且稍後在它的所有客戶端中使用它們。 我會檢查一下將它們定義爲BSTR的觀點,這可能是我們從一開始就犯的錯誤。 – 2009-08-23 09:03:45

+0

我會考慮將它們定義爲BSTR一個錯誤 - BSTRs _must_使用SysAllocString分配。字面寬字符字符串不是有效的BSTR,因爲它們不能以長度爲前綴。 – 2009-08-23 19:25:16

0

如果它應該始終是Unicode,那麼使用「T」構造就沒有用 - 只要做;

const LPCWSTR STRING_CONST_NAME = L"STRING VALUE"; 

「W」 是 「寬」 -

不知道怎麼定義的Windows LPC * STR的typedef與IDL相互作用,但如果LPSTR工作,各種各樣應該工作了。