2011-05-18 58 views
2

我用VS2008創建了一個ATL COM dll工作區。它已經生成了MyCom.idl接口。它是否提供了任何簡單的方法來添加一個方法到這個接口?添加方法到COM接口

回答

4

是的,有一個選項可以做到這一點。

enter image description here

2

如果您在類視圖中展開idl以右鍵單擊某個特定的類和「添加方法」或「添加屬性」,則會出現一個選項,該選項將帶您通過嚮導添加該方法的小嚮導,以及您的相關實施。

2

這並不難做到這一點不用嚮導。我瞭解到,添加COM接口方法硬盤的方式,因爲我懶得看它在MSDN,所以我在其他COM接口仔細地看了看,並通過添加屬性,方法試驗等

,首先有兩個使用嚮導時的缺點,特別是在編輯現有的COM接口時。首先它很慢,特別是如果你有一個有很多接口的大型組件。我坐在一個非常體面的工作站前,打開向導,完成這兩個或三個步驟所需的時間比手動添加IDL,.h和.cpp文件所用的時間要長。

其次是,當使用不同的Visual Studio,因此不同的嚮導版本會生成C++污垢像多個公共語句沒有任何需要和類似的東西。但是,如果下一位程序員再次使用嚮導,我建議您像嚮導一樣操作,以免進一步混淆 - 這會增加混淆並最終導致文件大小增加,類別聲明不可讀,編譯時間更長。只需在嚮導所在的相同位置插入相同類型的方法或宏即可。

所以,也許你可能會找到有用的,我發現這麼久。您可以在文章「Understanding IDL」中找到更多詳細信息,這是很古老的,但提供了基本的基本知識,我不會在這裏提到。

IDL文件包含您的組件將導出的所有接口定義。所以如果你想添加一個方法,你需要找到由「interface」關鍵字引入的相應的接口定義和一個通常以大寫字母I開頭的名稱。接口之前有一些註釋,其中包含[和] I爲簡單起見,不會解釋。使用Visual Studio時,IDL關鍵字將被正確突出顯示。這是一個典型的界面可能看起來怎麼樣:

[ 
    object, 
    uuid(0B2499FA-0D73-488C-B961-03FB8327485C), 
    dual, helpstring("IMyInterface Interface"), 
    pointer_default(unique) 
] 
interface IMyInterface : IDispatch { 
    // ... methods and properties 
}; 

現在讓我們假設IMyInterface的只包含一個方法,你想添加一個類似的第二個:內

[id(1), EXCLUDE_FROM_HELP] HRESULT DoSomething([in] long newVal, [out, retval] long* pRetVal); 

同樣有註釋[]括號。當添加一個新的方法增加id註釋值。還在輸入參數的[in]註釋參數之前,[out]參數將包含方法結果。如果只有一個結果,您可能需要使用一個使用結果作爲返回值的方法。然後使用[out,retval]註釋。

所以當添加這樣的方法複製上面的行時,增加ID並且改變方法名稱並相應地調整參數。

請注意[out]參數總是必須是一個指針。這有幾個原因,最明顯的是[in,out]也是可能的,因此參數的結果應該寫入組件內部的相同內存地址,以便可以將其傳回給調用者容易。還要注意,「真正的」返回值應該是一個HRESULT句柄,它將指示方法的成功或失敗。

現在讓我們看看C++頭文件。我假設你會找到正確的文件並自己放置。

STDMETHOD(DoSomething)(/*[in]*/ long newVal, /*[out, retval]*/ long* pRetVal); 

STDMETHOD宏負責HRESULT和calltype的結果值。這些註釋在這裏是無效的,但爲了澄清IDL文件中的預期用法,它們被添加爲註釋。儘管這些評論是可選的。請小心使用與IDL文件中相同的數據類型。

STDMETHODIMP CMyClass::DoSomething(/*[in]*/ long newVal, /*[out, retval]*/ long* pRetVal) 
{ 
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 

    long result = GetTheResultValueFromSomewhere(); 
    *pRetVal = result; 

    return S_OK; 
} 

STDMETHODIMP是一個與頭部不同的宏。基本上它也是這樣。重要的是AFX_MANAGE_STATE宏,如果你想使用MFC對話框中的資源作爲例子。想象一下上面例子中的值是通過提示用戶來決定的。請閱讀Technical Tips blog post

瞭解IDL機制將盡快幫助您發生錯誤,這些錯誤不一定是指邏輯中的問題,而是界面。它還可以讓你理解界面實際做了什麼,這將有助於你在使用嚮導時冒犯錯誤,所以我鼓勵任何人閱讀至少一些關於它的基本信息。