使用ATL爲COM組件增加多個雙接口

        自微軟開發ATL以來,使用ATL爲COM增加多個雙接口就是一個老大難的問題,儘管網上有不少個人聲稱有解決方案,但也都存在一些問題,微軟自己也在技術支持網站上說不建議爲組件增加多個雙接口。
        我想大多數想增加雙接口的人肯定是既想用虛表的高效性,又想用自動化接口的靈活性。想達到這個目的,還是有一些途徑的。

        我在翻閱相關資料時,偶然查到這麼一種用法,在idl文件中加自定義接口,想加多少加多少,最後再加一個集成的繼承於自動化接口的接口,舉個例子,加兩個自定義接口,IA和IB,均繼承自IUnknown,IA有方法fa,IB有方法fb,然後再加一個自動化接口IC,然後把IA和IB的方法原封不動地添加到IC下面,只不過在前面加上ID號。然後在COM組件的父類中添加IA、IB和IDispatchImpl<IC,......>,在組件的接口入口點處添加IA、IB和IDispatch,最後在組件中實現fa和fb方法。

        這樣做對於一些簡單的目的來說是可行的。比如我想通過晚綁定來訪問fa和fb,完全可以。比如說我想在C++中通過IA和IB接口訪問fa和fb,完全可以,不過這需要爲程序包含組件的頭文件和接口定義源碼,算是一種缺陷吧。

        其實這種方法缺陷還是不小的,但這和ATL中微軟對COM的實現方法有關,這種組件不能被客戶端用加載類型庫的方式使用,我試過,明明我的組件中有兩個接口,加載類型庫後,卻只能認出一個接口,而且只認準了其中一個接口,不管我怎麼修改接口名稱、接口說明等內容,它死活認不出另一個接口,然後我通過OLEView來查接口,也只認其中一個,不知道類型庫是怎樣被生成和加載的。

        這就爲組件的應用堵死了一條路,有些惘然若失。後來想了想,客戶端要想以自定義接口的方式使用組件,需要包含頭文件和接口定義文件,也算是對組件的封裝和一種保護吧,具有一定的商業意義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章