您能舉一個例子,通過比較顯示ATL的好處嗎?爲什麼人們使用ATL編程COM?
回答
開發人員很懶,喜歡那些很難完成的事情,ATL的設計使COM開發更容易。
在大多數情況下,ATL處理COM開發的許多混亂細節,如QueryInterface管理,引用計數和生命週期管理,以及COM支持的所有各種線程模型。它還爲雙接口,連接點,枚舉器等提供內置支持。
如果您不使用ATL或類似的東西,您將會編寫更多的代碼。這將是不幸的;)
編輯:
我不會寫沒有任何ATL COM代碼爲例子,因爲它是如此的可怕這樣做,但看看這個:
http://www.codeproject.com/KB/COM/simplecomserver.aspx
下載,然後看看simplecomserver項目下的下列文件:
registry.cpp
simplecomserverImpl.cpp
(約700行代碼)
現在想象一下,而不是寫所有的怪物,你可以從CCoComClass派生類,只是執行名稱的方法,然後做處理類實例化和註冊:
// Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(void)
{
return _AtlModule.DllCanUnloadNow();
}
// Returns a class factory to create an object of the requested type
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
}
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
// registers object, typelib and all interfaces in typelib
HRESULT hr = _AtlModule.DllRegisterServer();
return hr;
}
// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void)
{
HRESULT hr = _AtlModule.DllUnregisterServer();
return hr;
}
這聽起來像是你想要一些ATL簡化COM編程的具體例子;以下是我所遇到的。
CComObjectRootEx
:通過從CComObjectRootEx
派生您的COM類,你會得到線程安全的引用計數免費的。CComCoClass
:該基類實現所有實例化類,包括客戶端與所使用的組件CoGetClassObject
所需的IClassFactory
東西的方法。COM_INTERFACE_ENTRY
宏:ATL提供了一大堆宏BEGIN_COM_MAP
和END_COM_MAP
之間使用,你可以用它來實現您的要求,不管他們可能是正確的方式IUnknown::QueryInterface
膽量。IDispatchImpl
:如果您希望您的組件可以訪問腳本,則必須實施IDispatch
。 ATL提供了IDispatchImpl
類,這可以節省您自己實現它的麻煩。CComPtr
/CComQIPtr
:ATL提供這些智能指針類,其封裝到IUnknown::AddRef
,IUnknown::Release
和IUnknown::QueryInterface
呼叫。使用它們將使您的代碼更易於閱讀,並且不太容易出現COM引用計數錯誤。CComBSTR
/CComVariant
:ATL提供這些類,這降低了處理的BSTR
和VARIANT
COM類型的複雜性。
- 1. ATL COM +使用接口作爲參數
- 2. 爲什麼ATL COM註冊默認爲HKCR
- 3. 爲什麼人們使用textmate?
- 4. 爲什麼人們使用JSP?
- 5. pixel.gif,爲什麼人們使用它?
- 6. 爲什麼人們使用`Module.send(:prepend,...)`?
- 7. Pthread:爲什麼人們會使用pthread_exit?
- 8. C++ COM ATL DLL
- 9. 爲什麼人們爲編程語言創建標準
- 10. MFC COM或ATL COM(ActiveX)
- 11. COM與ATL版本
- 12. 託管字節[使用ATL/COM
- 13. 不使用ATL實現COM IDispatch
- 14. 何時以及爲什麼我們需要使用COM?
- 15. 人們使用什麼編程語言來編碼圖像文件?
- 16. 爲什麼ATL調用子類「超類」
- 17. COM ATL線程模型與否
- 18. ATL COM中的可爲空類型
- 19. 爲什麼我們在編程中使用弧度?
- 20. 人們使用Elasticsearch做什麼?
- 21. 代碼檔案?人們使用什麼?
- 22. 什麼是Autoconf?爲什麼人們使用它?我應該使用它嗎?
- 23. 爲什麼COM對象不使用IDisposable?
- 24. 爲什麼人們使用評論作爲商業邏輯
- 25. 如何爲com/atl dll項目使用visual leak detecter(vld)?
- 26. javascript的ATL COM事件
- 27. C3702 atl com事件需要
- 28. 與PHP溝通ATL COM dll
- 29. 如何通過ATL COM類對象作爲paramater到COM
- 30. 他們爲什麼叫做「四人幫」?
比較什麼? – Johnsyweb 2010-09-07 08:16:49
不使用ATL。 – wamp 2010-09-07 08:18:37