2010-11-29 27 views
1

我想在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程序員之間的任何想法?謝謝。

+0

你誇大,毫無疑問。獲得數百個宏名稱衝突不會發生。只需#undef他們。當你有十幾個人時,放棄COM。 – 2010-11-29 13:54:18

+0

我剛剛編寫了一個腳本來從編譯器警告中生成rename()條目。有834次衝突。我現在編譯它,似乎都可以。放棄使用這個組件並不是一種選擇(編程的好處總是一種選擇 - 比方說,放棄這個組件將需要我複製5年的工作,測試和解決另一個無關的應用程序中的錯誤, COM組件與')接口。 – Roel 2010-11-29 14:10:07

回答

0

那麼,你有三個選擇。

選項1.如果您可以更改該組件接口 - 那麼請重命名枚舉值,以免它們與Windows SDK衝突。

選項2.使用#importrename。儘管你有成百上千的這些元素,但你可以使用反斜槓構建一個漂亮的表格來分割列表。

選項3.嘗試將#import分離爲一個單獨的.h文件,以使其不包含在所有Windows SDK中,或者至少導入的文件數量少得多。這將消除或減少衝突,然後您可以使用rename來處理其餘的衝突。