component object model (COM) und Events



  • Hallo leute,

    ich möchte eine klasse erstellen (ohne den visuellen MFC schnickschnack), die folgendes leisten soll:

    sie soll sich bei einer COM-Klasse als EventSink registrieren und auf Events von dieser Klasse reagieren.

    dazu habe ich folgendes gemacht:
    - EventSink-Klasse von IDispEventImpl abgeleitet (die Template-Parameter habe ich denke ich richitg gesetzt)
    - in dieser Klasse meine Event-Handler funktionen definiert und mit den SINK_MAP makros "registriert"
    - da ich ständig Compiler-Fehlermeldungen bekommen habe wegen _Module, habe ich einfach eine globale Instanz _Module von CComModule angelegt 🙄

    in der funktion, die diese klasse verwendet habe ich folgendes gemacht (diese funktion wird aufgerufen wenn ich in meiner Test-App auf einen Button klicke):
    - CoInitialize aufgerufen
    - CoCreateInsance um IUnknown zu erhalten aufgerufen
    - Instanz von meiner EventSink Klasse angelegt
    - dann DispEventAdvise von der EventSink-Instanz mit dem IUnknown pointer als parameter aufgerufen

    ich bekomme dabei keine fehlermeldungen und es läuft auch, allerdings werden die EventHandler Funktionen nicht aufgerufen. 😞

    was muss ich denn noch machen? Vielleicht ein Thread erzeugen? oder ...?
    bin schon langsam am verzweifeln...
    oder kennt ihr vielleicht ein beispiel dazu?

    bin leider newbie in der Windows und in der COM-Programmierung...

    danke für eure hilfe!

    Gruß mathik



  • Gelte zwar wahrscheinlich nicht mehr als COM-Newbie, aber bei Events muß ich trotzdem meistens passen, und mit Dispatch-Events hab ich NULL Ahnung, aber ich versuch's mal 😉

    1. Erstmal: Hau' deine CComModule-Instanz raus, und mach es richtig:
      Einfügen/Neues ATL-Objekt
      keine Angst, du wirst erstmal nur gefragt, ob du ATL-Support zu diesem MFC-Projekt hinzufügen willst. "Ja klar". Dann kommt der ATL Object Wizard, der kann getrost gecancelt werden. Aber jetzt hast du offiziellen, legalen, und überhaupt nicht wieder loszuwerdenden ATL-Support
      Das ist aber nicht das Problem

    2. Das einfachste ist wahrscheinlich (evtl. in einem testprojekt) das den Wizard machen zu lassen, und sich dann den Code anzuschauen.

    3. Die ATL-Event-Helper sind darauf ausgelegt, die events von Child_Controls zu fangen - evtl. brauchst du einen Hack wie diesen

    4. Wenn das alles nichts hilft, poste vielleicht mal etwas code...



  • peterchen schrieb:

    Gelte zwar wahrscheinlich nicht mehr als COM-Newbie, aber bei Events muß ich trotzdem meistens passen, und mit Dispatch-Events hab ich NULL Ahnung, aber ich versuch's mal 😉

    1. Erstmal: Hau' deine CComModule-Instanz raus, und mach es richtig:
      Einfügen/Neues ATL-Objekt
      keine Angst, du wirst erstmal nur gefragt, ob du ATL-Support zu diesem MFC-Projekt hinzufügen willst. "Ja klar". Dann kommt der ATL Object Wizard, der kann getrost gecancelt werden. Aber jetzt hast du offiziellen, legalen, und überhaupt nicht wieder loszuwerdenden ATL-Support
      Das ist aber nicht das Problem

    2. Das einfachste ist wahrscheinlich (evtl. in einem testprojekt) das den Wizard machen zu lassen, und sich dann den Code anzuschauen.

    3. Die ATL-Event-Helper sind darauf ausgelegt, die events von Child_Controls zu fangen - evtl. brauchst du einen Hack wie diesen

    4. Wenn das alles nichts hilft, poste vielleicht mal etwas code...

    danke für die tipps,

    nachdem ich deinen tipp 1 befolgt habe läuft das jetzt... 🙂

    mir ist allerdings nicht klar was der da alles generiert hat... ich meine brauche ich diesen ganzen generierten schnickschnack?
    kann ich dass denn nicht alles "zu fuß" machen?
    gibts da irgendwelche informationen dazu?

    danke!

    Gruß mathik



  • Die hauptaufgabe von _Module ist eigentlich nur:
    a) die HINSTANCE der anwendung zu haben, damit CString usw. weiß, wo resourcen geladen werden sollen
    b) die insgesamt aktiven Objekte zu zählen, damit DLL's das "DllCanUnloadNow" implementieren können

    Nix davon, was mir jetzt einfällt was da zu machen ist

    Was der Wizard generiert ist hauptsächlich:

    - _Module.Lock() (von der ATL) ruft AfxOleLockApp() (von der MFC auf), das gleiche für Unlock.

    - InitATL ruf CoInitializeEx (daran könnnte es liegen!) bzw CoInitialize auf, und checkt die Kommandozeile ob der server registriert/deregistriert werden soll (nur für EXE-Server)

    (viel) mehr passiert eigentlich nicht...


Anmelden zum Antworten