我想在C++中使用COM庫。我有一個#import「TheLibrary.dll」,它創建了tlh和tli文件以及庫中的類。暫時#undef宏使用#import指令導入COM typelib
現在,我的問題是COM對象暴露了一些枚舉值,這些常量值也是在Windows SDK頭文件中。我認爲這樣做是爲了讓Visual Basic開發人員命名這些常量的變體,而不必使用它們的數字值。
但是這對我來說是一個問題,因爲這些頭文件包含在我的typelib被#import'ed之前;所以現在enum成員的聲明被替換爲windows頭文件中的數字常量,導致我的編譯失敗。
實施例:
窗口頭文件:
#define RES_AND ((ULONG) 0x00000000)
生成TLH:
enum __declspec(uuid(-some guid-))
RestrictionKind
{
RES_AND = 0,
.. etc
所以問題是顯而易見的; tlh中的枚舉被擴展了,其結果是試圖給一個數賦一個常量。
現在我明白了幾種解決方案,所有的人都沒有吸引力:
做一個「重命名」上的每個項目,在#進口的時間。有數百個這些常數,並不期待這一點。
一起捨去enums。這會嚴重影響我對COM對象的訪問(我還沒有嘗試過,也許整個庫甚至會變得無法使用)。
在#import之前做一個#undef所有這些常量。同樣,也有數百人,而最重要的是我不能夠以後使用它們 - 除非我再做一個的#define ...
所以我在虧損是一種這裏。我希望能夠對枚舉值進行批量重命名,但#import指令中的文檔並沒有給我太多希望。
其餘的COM程序員之間的任何想法?謝謝。
你誇大,毫無疑問。獲得數百個宏名稱衝突不會發生。只需#undef他們。當你有十幾個人時,放棄COM。 – 2010-11-29 13:54:18
我剛剛編寫了一個腳本來從編譯器警告中生成rename()條目。有834次衝突。我現在編譯它,似乎都可以。放棄使用這個組件並不是一種選擇(編程的好處總是一種選擇 - 比方說,放棄這個組件將需要我複製5年的工作,測試和解決另一個無關的應用程序中的錯誤, COM組件與')接口。 – Roel 2010-11-29 14:10:07