2009-11-16 90 views
4

我有一些MFC代碼(自定義的CWnd控件和一些需要公開的類),需要使用接口將其創建爲activex/COM對象。使用MFC支持製作ATL項目並製作ActiveX或製作MFC ActiveX控件更容易嗎?MFC COM或ATL COM(ActiveX)

當做一個activeX控件時,是做雙接口(就像在微軟的ACDual中解釋的那樣)好/差/沒有區別?

回答

1

如果你是一個COM的新手,MFC是一個更簡單的路線:嚮導更好,更有幫助。但它比ATL靈活得多,如果你只需要一對simpole接口來實現,這可能不是問題。

另外,IIRC MFC不支持雙接口。雙接口在兩種情況下很有趣: - 性能是一個問題。如調用一個簡短的方法執行數百萬次。 - 對象用戶使用C++進行編程。使用C++調用本地接口比調用自動化接口更方便。

總之,雙接口很酷,但只有免費擁有它們,它們才真正有趣。這意味着你使用一個支持它們的框架。如果你計劃在基於COM的工作,有趣的是調查在ATL和更深的COM知識。如果您只需提供幾個簡單的基於MFC的對象,只需粘貼到MFC即可。

1

使用MFC的COM有點痛苦 - 有太多的代碼要寫,要複製的宏 - 但是你必須知道你在做什麼,如果你混合使用MFC和ATL,因爲它們看起來很相似但不同,特別是如果你使用ATL創建窗口。

最主要的是,如果您從ATL使用MFC,則需要使用AFX_MANAGE_STATE(AfxGetStaticModuleState())啓動每個ATL方法,否則您將遇到隨機問題。當你用MFC實現COM時,這會自動完成,這就是爲什麼每個方法都有這些醜陋的METHOD_MANAGE_STATE宏。

除此之外,它只是工作。在ATL對象內的MFC對象是我所做的。

+0

如果我添加ATL支持我的mfc項目,然後添加一個ATL ActiveX對象..我怎麼能包裹我的自定義cwnd在該Atl ActiveX? CWnd :: create想要一個父母CWnd * ..在MFC中,父母將是一個COleControl(這是一個CWnd).. ATL的ActiveX是從CWindow派生.. – BabelFish 2009-11-17 15:39:51

1

我一直使用直線ATL,沒有用於開發COM組件的MFC。 MFC作爲一個應用程序框架非常有用,我通常不需要輕量級(非UI)COM組件。 ATL提供了對字符串,集合和各種實用工具類的大量支持,而不需要將所有MFC帶來的後勤複雜性引入(比如在每個公共API調用中設置上下文等)。如果您正在構建UI組件,它還包括通過CWindow及其朋友提供的一些基本UI支持。