Können Sie ein Beispiel angeben, das durch Vergleich die Nützlichkeit von ATL zeigt?Warum verwenden Menschen ATL für COM-Programmierung?
Antwort
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;
}
Es klingt wie Sie wollen einige konkrete Beispiele, wo ATL COM-Programmierung vereinfacht; Folgendes ist mir eingefallen.
CComObjectRootEx
: Durch Ihre COM-Klassen vonCComObjectRootEx
Ableiten Sie Thread-sichere Referenzzählung gratis bekommen.CComCoClass
: Diese Basisklasse implementiert alle Methoden für die Klasse instanziiert wird, einschließlich derIClassFactory
Sachen, die erforderlich ist für die KundenCoGetClassObject
mit Ihrer Komponente zu verwenden.COM_INTERFACE_ENTRY
Makros: ATL bietet eine ganze Reihe von Makros zwischenBEGIN_COM_MAP
undEND_COM_MAP
zu verwenden, die Sie für Ihre Anforderungen die Eingeweide vonIUnknown::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 SieIDispatch
implementieren. ATL bietet dieIDispatchImpl
Klasse, die die Mühe der Implementierung selbst erspart.CComPtr
/CComQIPtr
: ATL stellt diese Smart-Pointer-Klassen, die Anrufe zuIUnknown::AddRef
,IUnknown::Release
undIUnknown::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 denBSTR
undVARIANT
COM-Typen reduzieren.
Vergleich zu was? – Johnsyweb
ATL nicht verwenden. – wamp