COM-Events in MFC-Anwendung



  • Hallo da!
    Ich bin leider in die Verlegenheit gekommen, dass ich mit einer bestimmten Hardware über eine in VB erstellte DLL kommunizieren muss. Das funktioniert soweit auch gut, mit #import wurden die entsprechenden Header automatisch generiert, mit RegisterServer konnte ich manuell die CLSID in Erfahrung bringen und über den entsprechenden _com_ptr_t habe ich den COM-Server auch schon erfolgreich benutzt. Allerdings implementiert der Server auch 2 Events, die ich aus Effizienzgründen gerne behandeln würde anstatt auf Polling zurückzufallen. Nur hier beginnen meine Probleme, denn ich finde im Internet nahezu gar keine Ressource dazu. Ich habe in Erfahrung bringen können, dass der Server ein IDispatch-Interface (das durch #import generierte folgt weiter unten) für die Events deklariert und im Gegenzug ein ConnectionPoint(Container)-Interface implementieren muss, bei dem meine Anwendung sich eintragen kann. Muss ich nun dieses IDispatch-Interface implementieren und daraus sozusagen ein lokales Server-Objekt basteln? Ich stehe im Moment total auf dem Schlauch.

    Hier sind die entsprechenden Stellen aus den .tli und .tlh Dateien:

    [uuid("f0d9cfd4-5d84-4aac-b318-31cd4ea5c2ea"),dispinterface]
    __interface __CHWI : IDispatch
    {
        // Methods:
       [id(0x1)] void ReceivedNewValue ( );
       [id(0x2)] void BufferOverflow ( );
    };
    
    inline HRESULT __CHWI::ReceivedNewValue ( ) {
        return _com_dispatch_method(this, 0x1, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    
    inline HRESULT __CHWI::BufferOverflow ( ) {
        return _com_dispatch_method(this, 0x2, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    }
    

    Ich wäre euch super dankbar, wenn ihr mir sagen könntet wie ich die Sache angehen muss.

    Viele Grüße,
    Michael


  • Mod

    1. Small and simple ohne MFC
    http://www.codeproject.com/KB/COM/TEventHandler.aspx
    2. Die MFC macht es Dir wirklich leicht.
    Einfach ein entsprechendes Control in Deinem Fenster mit CreateControl erzeugen.
    Dann Event sink map einbauen (BEGIN_EVENTSINK_MAP, etc.)
    und das wars es schon.
    3. Auch das geht:
    http://support.microsoft.com/kb/181845/en-us
    4. Hier die MFC Basics
    http://msdn.microsoft.com/en-us/library/6xzc178b.aspx
    http://msdn.microsoft.com/en-us/library/baytax3s.aspx



  • Vielen Dank!
    Der erste Artikel ist schon wunderbar. Ich ziehe programmatische Lösungen eigentlich immer den "Ich ziehe aus dem Appwizard ein XYZ in die Klasse A, 50 Dateien bekommen einträge und ich habe gar keinen Plan, was eigentlich passiert ist" vor 🙂

    Danke nochmal... Ich hab bei Google immer die englischen Begriffe gesucht, vielleicht hat er darum nie diesen Artikel ausgespuckt 😞

    Edit: Der Artikel ist ja auf Englisch Oo Offenbar war das Englisch der anderen Artikel (von nicht-englischsprachigen) so schlecht, dass mir gutes Englisch jetzt wie Deutsch vorkommt 🙂

    Viele Grüße,
    Michael


Log in to reply