2011-09-25 48 views
3

我正在開發一個C++ COM庫來從VB6應用程序中使用它。 .idl文件定義了一些接口和一個類庫與實現這些接口的一些組件類:爲什麼在VB6中COM接口名稱被coclass名稱取代?

[ 
    local, 
    object, 
    uuid(....), 
    version(1.0) 
] 
interface ICOMCvPixelBuffer : IUnknown 
{ 
    .... 
}; 

[ 
    local, 
    object, 
    uuid(....), 
    version(1.0) 
] 
interface ICOMCvBitmap : IUnknown 
{ 
    .... 
    HRESULT GetPixelBuffer([retval][out] ICOMCvPixelBuffer** pBuffer); 
    HRESULT SetPixelBuffer([in] ICOMCvPixelBuffer* pBuffer); 
    .... 
}; 

[ 
    uuid(....), 
    version(1.0) 
] 
library COMCvLibrary 
{ 
    importlib("stdole32.tlb"); 
    interface ICOMCvBitmap; 
    interface ICOMCvPixelBuffer; 

    [ 
     uuid(....), 
     version(1.0) 
    ] 
    coclass CCOMCvPixelBuffer 
    { 
     [default] interface ICOMCvPixelBuffer; 
    }; 

    [ 
     uuid(....), 
     version(1.0) 
    ] 
    coclass CCOMCvBitmap 
    { 
     [default] interface ICOMCvBitmap; 
    }; 
}; 

在VB6的對象瀏覽器顯示CCOMCvBitmap類爲Sub SetPixelBuffer(pBuffer As CCOMCvPixelBuffer)SetPixelBuffer方法的定義。

爲什麼它不是在.IDL中聲明的Sub SetPixelBuffer(pBuffer As ICOMCvPixelBuffer)

回答

2

據我所知,VB6不喜歡COM對象實現2+自動化接口的想法。與此相伴,如果它實現一個,那麼它很可假設該接口由被聲明爲實現此接口組件類實現:

共類CCOMCvBitmap { [默認]接口ICOMCvBitmap;

這種方式VB6可能會使VB6開發人員更加簡單,它試圖解釋使用對象而不是接口的工作原理。

如果您對某個實驗感興趣,請嘗試對該行進行註釋「[默認] interface ICOMCvBitmap;」看看VB6是否會顯示類型爲界面。這不應該中斷互操作,因爲ATL實現對象仍將實現IProvideClassInfo並通告實現的接口。

+0

是啊,就是這樣。另一個約定是通過在名稱前加下劃線來隱藏接口類型,如_ICOMCvPixelBuffer。 –

3

最後我找到了我的問題的答案。

正如我從第".NET and COM: The Complete Interoperability Guide"號書中瞭解的那樣,如果coclass的默認接口在與coclass相同的類庫中定義,VB6的類型庫導入器將用coclass類型替換任何參數和默認接口類型的字段。

此外,對站在身後VB6力學一個有用的信息,可以發現here

Visual Basic使用類模塊名稱作爲默認接口的別名;也就是說,Visual Basic編譯器會默默地將類名映射到默認接口引用。

其中一個可行的解決方案是提供IUnknownCCOMCvPixelBuffer組件類的默認界面:

[ 
    uuid(....), 
    version(1.0) 
] 
coclass CCOMCvPixelBuffer 
{ 
    [default] interface IUnknown; 
    interface ICOMCvPixelBuffer; 
}; 
+0

很高興我找到了答案!這應該被標記爲接受的答案。 tlbimp和C#也會發生此行爲。 –