Grundsätzliche Frage zu CAtlModule Klassen



  • Hallo!

    Ich schnuppere gerade durch die ATL, um ihr Funktionalität kennenzulernen und abschätzen zu können, ob ich diese Library für mein Projekt benötige.

    Folgende Modulklassen bietet die ATL an:

    • CAtlBaseModule This class is instantiated in every ATL project.
    • CAtlComModule This class implements a COM server module.
    • CAtlModule This class provides methods used by several ATL module classes.
    • CAtlModuleT This class implements an ATL module.
    • CAtlExeModuleT This class represents the module for an application.
    • CAtlServiceModuleT This class implements a service.
    • CAtlWinModule This class provides support for ATL windowing components.

    Quelle:
    http://msdn.microsoft.com/en-us/library/3f3ab805%28VS.71%29.aspx

    Ich wollte nun zum Test ein Programm schreiben, dass verschiedene vom Betriebssystem angebotene COM Komponenten nutzt und mir mit CoCreateInstance() COM Objekte erzeugt, also einen COM Client. Eigene COM Komponenten wollte ich nicht anbieten (kein COM Server).

    Ich habe mich nun über den Nachmittag mit der ATL beschäftigt und unter anderem ein paar Collection Klassen ausprobiert, bis ich über die Modul Klassen der ATL gestolpert bin.

    Anhand der Doku, die ich auf MSDN gefunden habe, bin ich mir aber über den Sinn der Modul Klassen nicht klar.

    Es geht um CAtlExeModuleT und CAtlServiceModuleT. Sind diese beiden Klassen bzw. Templates dazu gedacht, dass ich einen COM Server schreibe oder dass ich ein beliebiges Programm bzw. einen beliebigen Service schreibe, der unter anderem COM Objekte erzeugt, also nur ein COM Client ist?

    Danke euch 🙂

    Schöne Grüße,

    Flasher



  • Von einigen dieser Klassen gibt es eine globale Instanz in jedem ATL-Projekt. Sie implementieren modulweite Dienste und Informationen, auf die von anderen ATL-Klassen zugegriffen wird.

    z.B. gibt es eine Instanz CAtlBaseModule _AtlBaseModule . Diese wird u.a. von CString::LoadString verwendet, um das Instanzhandle zu finden. Je nachdem, welchen Anwendungstyp du hast, muß diese unterschiedlich initialisiert werden.

    Unter ATL 3.0 waren diese Dienste alle in einer Klasse, Instanz _Module , von CComModule abgeleitet, zusammengefaßt. Jetzt sind verschiedene Dienste auf verschiedene Klassen und Instanzen aufgeteilt. Es gibt:

    CAtlBaseModule _AtlBaseModule;
    Instanz wird von ATL-Bibliotheken zur Verfügung gestellt. Enthält hauptsächlich Versionsinformation und Modulhandles (HINSTANCE's) für Ressourcen usw.

    CAtlComModule _AtlComModule;
    Instanz wird von ATL-Bibliotheken zur Verfügung gestellt. Enthält für COM Server notwendige Dienste (z.B. Registrierung der Komponenten).

    CAtlWinModule _AtlWinModule;
    Instanz wird von ATL-Bibliotheken zur Verfügung gestellt. Enthält für Window-Klassen notwendige Daten.

    CAtlDebugInterfacesModule _AtlDebugInterfacesModule;
    Instanz wird von ATL-Bibliotheken zur Verfügung gestellt, Wenn _ATL_DEBUG_INTERFACES definiert ist. dadurch werden zusätzliche Hooks u.a. für das Debuggen von QueryInterface-Aufrufen aktiviert.

    C myproject Module _AtlModule
    Dies ist eine von deinem Projekt implementierte, von CAtlModule abgeleitete Klasse, die du selbst instanzierst. Die Die Vererbungshierarchie ist im Normalfall:

    CAtlModule
    ← CAtlModuleT<CmyprojectModule>
    ← CAtlXxxxModuleT<CmyprojectModule>
    ← CmyprojectModule

    wobei Xxxx jeweils Dll, Exe oder Service ist - je nach Typ der Anwendung.

    😃 oder 😕 ?



  • Danke für deine Antwort!

    Grundsätzlich ist mir klar, dass ich die Klassen verwenden kann um eine Executable oder einen Service zu schreiben. Mir ist nur nicht klar, ob diese Klassen von ihrer Funktionalität her dafür ausgelegt sind um damit einen COM server zu realisieren oder ob sie generell dafür gedacht sind Executables und Services zu entwickeln.

    Schöne Grüße,

    Flasher


  • Mod

    Jedes Programm das ATL benutzt braucht ein "Modul"!
    Also auch wenn Di COM Server entwickelst, oder COM über ATL in der MFC einsetzt.



  • D.h. jedes Programm das die ATL nutzt muss von der CAtlModul Klasse bzw. deren Kindern abgeleitet werden?

    Ich habe das gestern nicht so gemacht. Ich habe einfach die benötigten ATL Header eingebunden:

    z.B.:

    #include <atlfile.h>

    int main(void) {

    CAtlFile f;
    f.Create(.........)
    f.Read(....)

    }

    usw.


  • Mod

    Nicht "jedes Programm mus abgeleitet werden".

    Für bestimmte Funktionen und Klassen (nicht für ale) muss eine Modul-Instanz vorhanden sein!



  • Ah ok, danke dir!

    Ich werde mich jetzt weiter einlesen und versuchen herauszufinden für welche Klassen bzw. Funktionen eine Ableitung von CAtlModul notwendig ist.

    Schöne Grüße,

    Flasher



  • Die Basisimplementationen der CAtlXxxxModuleT (also Dll/Exe/Service) kümmern sich um die korrekte initialisierung der anderen Instanzen (Base, Win, COM), und sind insofern nötig für einen großen Teil der ATL.

    Wenn Du die CmyprojectModule-Instanz weglassen willst (warum eigentlich?), dann müßtest Du diese Initialisierung selbst durchführen.


Anmelden zum Antworten