Events aus VB.Net-DLL in VB6 behandeln



  • Hallo zusammen,
    ich habe das Problem, dass ich in einer VB.Net-DLL Events bereitstellen muss, die von dem aufrufenden VB6-Programm abgefangen werden sollen. Leider funktioniert das ganze nicht. Folgender Code:

    .NET
    
    Public Module Module1
    
        Public Event blubb()
    
        Public Sub raise_blubb()
    
            RaiseEvent blubb()
    
        End Sub
    
    End Module
    
    VB6
    
    ... irgendwo
    
    raise_blubb() 
    
    ... dann als Event-Handler, wie im VB6-Objektkatalog angezeigt
    
    Public Sub blubbEventHandler()
    
        MsgBox ("test")
    
    End Sub
    

    Die Funktion blubbEventHandler() wird nicht aufgerufen. Leider finden sich im Internet auch nicht sonderlich viele Informationen dazu. Hat jemand eine Idee?

    Gruß



  • Aus Deinem Code wird nicht ersichtlich, wie Du den Eventhandler installierst. Das kann so übrigens auch gar nicht klappen, weil man Module in VB6 so nicht verwenden kann (nur Klassen haben Events!)

    => Du musst das Event in einer Klasse deklarieren und dann in VB6 eine Instanz dieser Klasse deklarieren (und zwar mit dem Zusatz 'WithEvents'). Dann klappt es.



  • Ich hatte die Events ursprünlich in einer Klasse... deswegen dachte ich mir, ich versuchs mal "einfacher". Mit "withevents" bekomme ich dann die Meldung, "Das Objekt löst keine Automatisierungsereignisse aus". (Angezeigt wird die Event-Funktion aber im Objekt-Explorer).

    Dim WithEvents x As clsDatamanagerConnection
    
    Private Sub Command1_Click()
        Set x = New clsDatamanagerConnection
        x.test
    End Sub
    
    Public Sub event_testEventHandler()
        MsgBox ("test")
    End Sub
    


  • Ich kann dazu jetzt leider nicht viel sagen, ich habe kein VB6 mehr installiert und kenne mich mit der Rückwärtskompatibilität auch nicht so gut aus. Zwei mögliche Punkte:

    Eventuell muss für das Event separat das 'ComVisibleAttribute' gesetzt werden? Dagegen spricht, dass es im Objektbrowser sichtbar ist.

    Deine Eventhandlerfunktion trägt einen komischen Namen. Eventhandler müssen in VB6 doch immer den Namen 'Objektname_Eventname' tragen, um gefunden zu werden. Hast Du eventuell einfach den falschen Namen hingeschrieben? Dagegen spricht, dass die Fehlermeldung eigentlich etwas anderes vermuten lässt.

    Ansonsten: falls es mit Events partout nicht klappen will, kannst Du ja stattdessen in .NET eine Schnittstelle definieren, die das Callback organisiert. Das ist zwar aufwendiger als die Benutzung von Events, kommt aber aufs selbe raus.

    Ansonsten mache ich mal dezent für die Foren auf http://activevb.de/ Werbung, dort sollten sich im Zweifelsfall Leute finden, die sowohl mit VB6 als auch mit .NET arbeiten und sich eventuell mit der Interoperabilität auskennen.



  • Hallo,

    das gleiche Problem habe ich auch.
    Wenn man das Attribut <ClassInterface(ClassInterfaceType.None)> verwendet und gleichzeitig eine eigene Schnittstelle für die Klasse veröffentlicht, werden für jedes Event automatisch die Prozeduren add_[Eventname] und remove_[Eventname] erzeugt.
    Die Prozeduren erwarten als Übergabeparameter ein Objekt von dem Typ des öffentlichen Delegaten, den man in der Schnittstelle definiert hat.

    Nur, wie verwende ich das in VB6?
    Mit withevents sind die Ereignisse nicht verfügbar.

    Gruß
    Holger



  • Hallo,

    ich habe eine Lösung im Netz gefunden.
    Unter dem link http://www.codeguru.com/csharp/csharp/cs_misc/com/article.php/c6747/ gibt es einen Artikel, der es gut erklärt.

    Bei mir hat es anschließend geklappt (nachdem ich mal wieder festgestellt habe, dass VB6 long nicht gleich VB.NET long ist 🙄 ).

    Gruß
    Holger


Anmelden zum Antworten