2010-09-07 5 views

Antwort

3

Entwickler sind faul und bevorzugen Dinge, die einfach sind über Dinge, die schwer sind, und ATL wurde entwickelt, um COM-Entwicklung zu erleichtern.

In den meisten Fällen kümmert sich ATL um viele der unordentlichen Details der COM-Entwicklung, wie zum Beispiel QueryInterface-Management, Referenzzählung und Lebensdauermanagement sowie alle verschiedenen Threading-Modelle, die COM unterstützt. Es bietet auch integrierte Unterstützung für Dinge wie Dual-Schnittstellen, Verbindungspunkte, Enumeratoren usw.

Wenn Sie nicht ATL oder etwas ähnliches verwenden, werden Sie viel mehr Code schreiben. Das wäre bedauerlich;)

Edit:

Ich bin nicht für ein Beispiel all COM-Code ohne ATL gehen zu schreiben, weil es so entsetzlich ist, dies zu tun, aber lesen Sie in diesen:

http://www.codeproject.com/KB/COM/simplecomserver.aspx

herunterladen, die dann unter dem simplecomserver Projekt in den folgenden Dateien aus:

Registry.cpp

simplecomserverImpl.cpp

(rund 700 Zeilen Code)

Nun, da sich vorstellen, anstatt all diese Monstrosität des Schreibens, eine Klasse von CCoComClass ableiten könnte und nur die Name-Methode implementieren, und dann tun Sie dies zu handhaben Klasseninstanziierung und Registrierung:

// 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

Können Sie ein Beispiel geben? – wamp

+0

Ein Beispiel für was? – Gerald

+0

Verwenden von ATL, um die Entwicklung zu erleichtern? – wamp

7

Es klingt wie Sie wollen einige konkrete Beispiele, wo ATL COM-Programmierung vereinfacht; Folgendes ist mir eingefallen.

  • CComObjectRootEx: Durch Ihre COM-Klassen von CComObjectRootEx Ableiten Sie Thread-sichere Referenzzählung gratis bekommen.

  • CComCoClass: Diese Basisklasse implementiert alle Methoden für die Klasse instanziiert wird, einschließlich der IClassFactory Sachen, die erforderlich ist für die Kunden CoGetClassObject mit Ihrer Komponente zu verwenden.

  • COM_INTERFACE_ENTRY Makros: ATL bietet eine ganze Reihe von Makros zwischen BEGIN_COM_MAP und END_COM_MAP zu verwenden, die Sie für Ihre Anforderungen die Eingeweide von IUnknown::QueryInterface in der richtigen Art und Weise implementieren können, was auch immer sie sein mögen.

  • IDispatchImpl: Wenn Sie möchten, dass Ihre Komponenten für Skripts zugänglich sind, müssen Sie IDispatch implementieren. ATL bietet die IDispatchImpl Klasse, die die Mühe der Implementierung selbst erspart.

  • CComPtr/CComQIPtr: ATL stellt diese Smart-Pointer-Klassen, die Anrufe zu IUnknown::AddRef, IUnknown::Release und IUnknown::QueryInterface einzukapseln.Wenn Sie sie verwenden, wird Ihr Code leichter lesbar und weniger anfällig für Fehler beim Zählen von COM-Referenzen.

  • CComBSTR/CComVariant: ATL bietet diese Klassen, die die Komplexität des Umgangs mit den BSTR und VARIANT COM-Typen reduzieren.

+0

Welche Headerdateien/Bibliotheken muss ich für die Verwendung von ATL hinzufügen? – wamp

+1

Das klingt wie eine separate Frage ..... :) –

+0

Muss ich noch 'CoInitialize (NULL)' und 'CoUninitialize()' aufrufen, wenn ich zu ** ATL ** wechseln? – wamp