2010-02-03 32 views
2

我需要實現一個實現了,我已經給雙方一個.tlb文件和.idl文件中的特定接口的簡單ATL COM對象的ATL COM對象。界面非常簡單,只包含一個方法。過去我創建了許多ATL對象,但從來沒有一個必須實現特定的接口。我需要做什麼來實現這一目標?我假設我不知何故需要在我的新對象IDL中引用接口的IDL或TLB?創建實現一個特定的接口

歡迎任何指針。

回答

4

它比這裏提出的其他答案更自動。所有的樣板代碼都是由Visual Studio爲您編寫的。

你很幸運,你有.idl,它是迄今爲止最常見的,我認爲。

你可以.idl文件的內容粘貼到您的ATL COM項目現有的.idl文件,這將讓你訪問它的聲明。例如,像這樣可以粘貼到一個IDL文件:

[ 
    object, 
    uuid(ecaac0b8-08e6-45e8-a075-c6349bc2d0ac), 
    dual, 
    nonextensible, 
    helpstring("IJim Interface"), 
    pointer_default(unique) 
] 
interface IJim : IDispatch 
{ 
    [id(1), helpstring("method SpliceMainbrace")] HRESULT SpliceMainbrace(BSTR* avast); 
}; 

然後在類視圖中,右鍵點擊你的類,然後選擇Add | Implement Interface

注意,在此對話框中,你其實可以瀏覽一個.tlb文件,但我認爲這是更好地爲這些事情純文本來源,版本控制等。

從列表中選擇IJim,按>按鈕將其添加到列表中實現。按完成

Visual Studio將添加到您的類(一堆其他垃圾沿,使其工作):

// IJim Methods 
public: 
    STDMETHOD(SpliceMainbrace)(BSTR * avast) 
    { 
     // Add your function implementation here. 
     return E_NOTIMPL; 
    } 
+0

幫助字符串不匹配代碼段中的接口名稱。 – sharptooth 2010-02-03 10:00:08

+0

完美!謝謝。 – Rob 2010-02-03 10:00:15

+0

@sharptooth - 好點,不希望人們得到IFred和IJim混淆,所以我解決了它。 – 2010-02-03 10:01:28

1

當你編譯.idl文件,你可以問MIDL產生與C++接口定義頭文件 - 包括頭文件和特定接口的C++相當於繼承你的實現類。您可能還需要將C++接口作爲參數傳遞給ATL幫助器基類,如IDispatchImpl

+0

看到這個問題如何繼承:http://stackoverflow.com/questions/1729834/whats-the-purpose-of-iunknown-member-functions-in-endcommap – sharptooth 2010-02-03 09:52:24

1

,如果你有一個interface.tlb文件,你可以使用

#import "interface.tlb" 

將其包含在一個.cpp文件,編譯器將.TLB轉換成C++風格的接口聲明。它會自動創建一個名爲的文件interface.tlh,然後#includes

然後你使用普通的C++代碼風格編寫實現在生成的.tlh文件中的接口的類。

1

我看不出我的問題添加到接受的答案,但我試過遵循他的例子給出的說明,但是當選擇項目單選按鈕時,我無法獲得在「實現接口」對話框中列出的IJim接口,即使在我編譯IDL文件後沒有列出任何接口,而是選擇導航到類型庫也沒有幫助。

+0

我已經想出了類視圖不允許你實現自己的接口的答案。如果改爲選擇不同的ATL對象並選擇「實現接口」,我可以在接口列表中看到IJim – 2010-03-04 11:54:46

相關問題