2010-03-03 72 views
0

我們有多個接口的IDL文件中定義的,其中兩個有成才這樣的:是什麼導致IDL文件中的名稱衝突?

[ 
    object, 
    uuid(79E24BAA-DC12-4caf-91DD-2A4D47FED30A), 
    helpstring("ISomeInterface Interface"), 
    pointer_default(unique) 
] 
interface ISomeInterface: IUnknown 
{ 
    [propget, id(2)] 
    HRESULT SOMEMethod([out, retval] BSTR* pValue); 
}; 

[ 
    object, 
    uuid(834421B6-511D-457D-B50C-69E7E1B65471), 
    dual, 
    nonextensible, 
    helpstring("IACompleteDifferentInterface Interface"), 
    pointer_default(unique) 
] 
interface IACompleteDifferentInterface : IDispatch 
{ 
    [propget, helpstring("property SomeMethod")] 
    HRESULT SomeMethod([out, retval] BSTR* pVal); 
    [propput, helpstring("property SomeMethod")] 
    HRESULT SomeMethod([in] BSTR newVal); 
} 

它們是兩個完全不相干的接口,碰巧有一個方法具有相同名稱(但具有不同的外殼爲示出)。 一切似乎都OK,但是當我們試圖編譯調用

ISomeInterface -> SOMEMethod 

我們得到一個錯誤,它並不存在的項目。如果我們打電話

ISomeInterface -> SomeMethod 

它編譯得很好。

如果我們重命名任何一種方法,它也編譯好。我不希望在兩個不同的界面中出現命名衝突,但似乎是發生了什麼。

我們可以通過重命名其中一個來修復它,但我真的很想了解這個問題。任何人都可以爲我解釋嗎? 謝謝

回答

2

心靈調試powerz告訴我你正在託管項目中使用類型庫。 .NET類型庫導入程序(Tlbimp.exe)具有一個模糊的錯誤,如果它在庫中多次出現,則會錯誤地將方法或屬性名稱大寫。它使用第一個遇到的大寫字母。

第一種方法是忽略它,託管代碼可能只是使用大小寫錯誤的標識符。或者你可以升級進口商,我相當肯定這個bug在this one被修復。

+0

謝謝,你的phsyic調試能力是驚人的,我們正在使用它在一個託管的c#項目(我會包括信息,它跨過我的腦海,它是相關的),所以你的答案可能是正確的。我會嘗試你建議的新tlbimp,謝謝。 – 2010-03-03 16:49:58

0

IDL似乎對我很好。如何將結果類型庫導入到您的應用程序中一定存在問題。

檢查您的#import報表。是否有重命名屬性更改「SOMEMethod」爲「SomeMethod」,或ISomeInterface IACompleteDifferentInterface?

查看由#import自動生成的標頭。你可能會在那裏找到線索。