我用VS2008創建了一個ATL COM dll工作區。它已經生成了MyCom.idl接口。它是否提供了任何簡單的方法來添加一個方法到這個接口?添加方法到COM接口
回答
是的,有一個選項可以做到這一點。
如果您在類視圖中展開idl以右鍵單擊某個特定的類和「添加方法」或「添加屬性」,則會出現一個選項,該選項將帶您通過嚮導添加該方法的小嚮導,以及您的相關實施。
這並不難做到這一點不用嚮導。我瞭解到,添加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機制將盡快幫助您發生錯誤,這些錯誤不一定是指邏輯中的問題,而是界面。它還可以讓你理解界面實際做了什麼,這將有助於你在使用嚮導時冒犯錯誤,所以我鼓勵任何人閱讀至少一些關於它的基本信息。
- 1. COM接口方法限制
- 2. iTunes COM接口 - 無法將歌曲添加到庫
- 3. 訪問一個COM接口方法C++
- 4. 通過COM接口調用JavaScript方法
- 5. 向接口添加額外的方法
- 6. 添加一個COM接口到現有的應用程序(EXE)
- 7. XSD架構到COM接口
- 8. 將接口集合添加到接口
- 9. 蟒蛇加載窗口COM接口
- 10. PowerShell:直接添加對COM接口ID的引用
- 11. iTunes COM接口
- 12. Casting COM接口
- 13. COM雙接口
- 14. 如何將接口添加到WCF ServiceContract更改方法的URL
- 15. 將通用擴展方法添加到接口,如IEnumerable
- 16. 添加COM庫到Flash CS5.5
- 17. 添加文件到Itunes com
- 18. COM接口的GUID
- 19. Siebel COM接口 - PHP
- 20. COM接口聲明
- 21. 擴展方法到接口
- 22. 使用COM接口在iTunes中訪問新添加的曲目
- 23. Stm32虛擬COM端口 - 無法連接
- 24. 連接幾個COM端口到一個
- 25. 將事件綁定到COM接口
- 26. 使用pySerial連接到非COM端口
- 27. 。COM接口COM服務器失敗,0x80080005
- 28. IUnknown接口 - 用於COM \ COM +對象?
- 29. 將COM接口傳遞迴庫的正確方法是什麼?
- 30. MethodImplAttribute(InternalCall,Runtime)對COM Interop接口的方法做什麼?