Fragen zum Einbinden von COM DLL'



  • Der Midl Kompiler erzeugt aus einer idl Datei eine binäre tlb Datei. In beiden Dateien stehen Informationen über die Interfaces der dll. Funktionsignaturen, Typen. Enums, ...

    1. Wozu braucht man eine tlb oder idl? Man könnte doch einfach die compilierte dll nehmen?

    2. Funktioniert bei einer Com Dll auch (afx)Loadlibrary?

    3. Was besagt diese Zeile?

    #import "AlarmLog.tlb" named_guids, no_namespace
    

    Kopiert der Präprozessor die binäre TypeLib in den Source?

    4. Ist das obige import die einzige Möglichkeit eine TypeLib in ein DSP Projekt einzubinden oder gibt es noch mehrere?



  • (1)
    - IDL : Interface-Beschreibung, dein Quelltext. Die definierst du, wenn du eine Komponente erstellst
    - TLB (Type Library): "compilierte" Interface-definition. Hier landet ales, was im [library]-Block der IDL aufgeführt oder referenziert wird. (ist bereits verifiziert, und kann u.a. über Systemkomonenten gelesen werden ==> ITypeLib, ITypeInfo)
    (2) Eine DLL kannst du genauso gut verwenden wenn sie die Typbibliothek enthält. Üblicherweise bindet man die .tlb als ressource in die DLL oder EXE ein, und beim Laden der Typbibliothek gibt es einen Standardmechanismus, daß man da rankommt.

    mit anderen Worten: Der Client verwendet normalerweise die Typbibliothek, die kann in dem Server "verpackt" sein.

    (3) #import "tlb" (hier kannst du auch eine DLL oder EXE angeben die die typbibliothek enthält)
    liest die .TLB und erzeugt temporäre .tlh, .tli-Dateien mit C++-Deklarationen, die der Typbibliothek entsprechen (die Dateien werden icht sofort wieder gelöscht, kannst Du dir also angucken)
    named_guids und no_namespace sind import-Optionen, #import ist da sehr flexibel - siehe MSDN

    (4) Gibt noch ein paar andere, aber #import ist IMO die beste.

    a) MIDL kann einen entsprechenden Header selbst erzeugen. Das ist die Standardkonfiguration für ein mit dem Wizard erstelltes COM-Objekt.
    b) in der MFC kannst du im Klass Wizard "Import Type Library" wählen. Das ergibt wieder einen anderen Satz von Wrapperklassen.

    Beide varianten haben Nachteile: nicht Konfigurierbar, MIDL erlaubt nur Zugriff auf die Basisinterfaces, und MFC geht nur mit MFC und (glaub ich) nur mit Dispatch - Interfaces.

    Das beste: #import kann "High level wrapper" erstellen. Die Abstraktion ist nicht perfekt, und Fehler weden über Exceptions weitergegeben, aber wenn man damit kein Problem hat, macht das richtig Spaß.

    High Level Wrappers: Auf Properties mußt du nicht über die getter/setter-methoden, sondern wie auf richtige Membervariablen zugreifen (geht nur für MSVC mittels __declspec(property)). [out, retval] wird wieder zum Rückgabewert gemacht, und "unhandliche" Parameter (VARAINT, BSTR) werden durch Wrapper-Klassen ersetzt (_variant_t, _bstr_t), die um einiges angenehmer sind.



  • Vielen Dank Peter. Hast mir schon wieder aus der Patsche geholfen 🙂


Anmelden zum Antworten