2010-09-07 82 views

回答

3

開發人員很懶,喜歡那些很難完成的事情,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; 
} 
+0

你能提供一個例子嗎? – wamp 2010-09-07 08:56:30

+0

一個什麼樣的例子? – Gerald 2010-09-07 08:58:24

+0

使用ATL緩解發展? – wamp 2010-09-07 09:04:44

7

這聽起來像是你想要一些ATL簡化COM編程的具體例子;以下是我所遇到的。

  • CComObjectRootEx:通過從CComObjectRootEx派生您的COM類,你會得到線程安全的引用計數免費的。

  • CComCoClass:該基類實現所有實例化類,包括客戶端與所使用的組件CoGetClassObject所需的IClassFactory東西的方法。

  • COM_INTERFACE_ENTRY宏:ATL提供了一大堆宏BEGIN_COM_MAPEND_COM_MAP之間使用,你可以用它來實現您的要求,不管他們可能是正確的方式IUnknown::QueryInterface膽量。

  • IDispatchImpl:如果您希望您的組件可以訪問腳本,則必須實施IDispatch。 ATL提供了IDispatchImpl類,這可以節省您自己實現它的麻煩。

  • CComPtr/CComQIPtr:ATL提供這些智能指針類,其封裝到IUnknown::AddRefIUnknown::ReleaseIUnknown::QueryInterface呼叫。使用它們將使您的代碼更易於閱讀,並且不太容易出現COM引用計數錯誤。

  • CComBSTR/CComVariant:ATL提供這些類,這降低了處理的BSTRVARIANT COM類型的複雜性。

+0

我需要包含哪些頭文件/庫以使用ATL? – wamp 2010-09-08 03:56:19

+1

這聽起來像一個單獨的問題..... :) – 2010-09-08 14:07:47

+0

如果我切換到** ATL **,還是需要調用'CoInitialize(NULL)'和'CoUninitialize()'嗎? – wamp 2010-09-13 01:57:57