Announcement

Collapse
No announcement yet.

Delphi COM Event funktioniert nicht in Visual Basic

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Delphi COM Event funktioniert nicht in Visual Basic

    Hallo,

    mein Delphi Automationsserver soll Events an eine Visual Basic Applikation liefern. In Visual Basic können meine Events empfangen werden, doch wenn ich z.B.: einen Dateinamen im Format WideString als Rückgabe definiere kann die "Feindliche" Anwendung nicht mehr kompiliert werden. Mein Delphi test Client funktioniert jedoch.
    In Der Typbibliothek hab ich den Dateinamen als WideString und als Rückgabewert HResult eingestellt.

    function Fehler(FehlerTxt: WideString): HResult [dispid $00000003]; stdcall;

    Kann das so eigentlich auch Für Visual Basic funktionieren. Delphi - Delphi Application im Local Server Architektur laufen.

    Bitte um Hilfe

    Ingemar

  • #2
    Hallo,

    für Visual Basic muss der eigene mit Delphi geschriebene COM-Server ein <b>Dual Interface</b> verwenden, damit der Zugriff über die späte Bindung möglich ist (VB verwendet für "frühe Bindung" eine andere Bedeutung als Delphi!). Es gibt keinen Grund, die Voreinstellung für <b>safecall</b> für das Dual Interface zu ändern, wobei das Event-Interface selbst als <b>dispinterface</b> (nur späte Bindung) gekennzeichnet wird. Bei einem dispinterface wird technisch gesehen alles als OleVariant transportiert, so dass man dort auch gleich alle Parameter von diesem Typ deklarieren kann.

    Das folgende Beispiel ist VB-tauglich :-)

    <pre>
    IDelphi6AutomationSrvObj = interface(IDispatch)
    ['{1DF6D22E-809F-40B6-A469-AA3C69FADB7F}']
    function DoWork(iValue: Integer): Integer; safecall;
    procedure Show; safecall;
    procedure Hide; safecall;
    end;

    IDelphi6AutomationSrvObjDisp = dispinterface
    ['{1DF6D22E-809F-40B6-A469-AA3C69FADB7F}']
    function DoWork(iValue: Integer): Integer; dispid 1;
    procedure Show; dispid 2;
    procedure Hide; dispid 3;
    end;

    IDelphi6AutomationSrvObjEvents = dispinterface
    ['{27F5FB83-3B69-4FC6-88F5-C9EAD1E9642A}']
    procedure OnWork(iValue: Integer); dispid 1;
    end;
    </pre&gt

    Comment


    • #3
      Das ist natürlich wunderbar(bei Eric Harmon drin).
      Aber leider mir ist nicht klar:
      Wie ruft man Events in Visul Basic von Delhi Com server. Alle schreiben dass es möglich aber kein sagt
      WIE

      Grus

      Comment


      • #4
        Hallo,

        &gt;Wie ruft man Events in Visul Basic von Delhi Com server

        was ist damit gemeint? Wenn ein VB-Programm auf die vom Delphi-COM-Server ausgelösten Events reagieren soll, muss dort der Bezug über <B>WithEvents</b> hergestellt werden.

        Ich habe dafür nur ein Beispiel für <B>VB.NET</b> am Lager (der alte VB-Weg ist ähnlich, nur erfolgt dort eine implizite Kopplung über den Namen der Ereignisbehandlungsmethode für das Event, während VB.NET dazu das Schlüsselwort <b>Handles</b> nutzt):
        <pre>
        Private WithEvents aSrv As New D6AutomationSrv.Delphi6AutomationSrvObjClass()
        <br>
        Private Sub OnWork(ByVal iNr As Integer) Handles aSrv.OnWork
        ListBox1.Items.Add(" OnWork-Event: " + iNr.ToString())
        End Sub
        <br>
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim iResult As Integer
        Dim iValue As Integer
        iValue = Int32.Parse(TextBoxValue.Text)
        ListBox1.Items.Add("DoWork wird aufgerufen...")
        iResult = aSrv.DoWork(iValue)
        ListBox1.Items.Add("DoWork kehrt zurück - Rückgabewert: " + iResult.ToString())
        End Sub
        </pre&gt

        Comment


        • #5
          Hallo,
          Vielen Dank für Feedback

          >>was ist damit gemeint? Wenn >>ein VB-Programm auf die vom >>Delphi-COM-Server >>ausgelösten Events >>reagieren soll, muss dort >>der Bezug über With Events >hergestellt werden.

          Ja, da hab ich ein Problem.

          Man kann Objecte nicht
          mit WithEvents deklarieren
          bei Visual Basic 6

          So etwa wie

          Dim t WithEvents As Object

          Set t = CreateObject("DelhiTestEvent.EventIntf")

          So geht nicht.

          Bei t.OnText kommt dann logischerweise die Meldung dass object unterstütz nicht diese Methode (obwohl VB Brauser sagt das Diese Delphi Methode ist da).

          Ich vermute stark das man
          muss "heiliges" WithEvents
          irgedwo (wie) benutzen.
          Weis leider aber nicht wo und wie genau.

          Dank

          Comment


          • #6
            Hallo,

            meine ersten Erfahrungen mit Visual Basic habe ich in Gestalt von VB.NET mit Visual Studio .NET gemacht. Daher kann ich nicht mit eigenen VB6-Erfahrungen dienen. Ich kann mir allerdings lebhaft vorstellen, dass es ähnlich wie bei VBA oder VB.NET zugeht:
            <br><br>
            1. Dem Projekt wird ein Verweis auf die <b>Typbibliothek</b> des Automation-Servers (Delphi-COM-Objekt) hinzugefügt.
            <br><br>
            2. Anstelle vom neutralen <i>Object</i> wird eine Variable vom richtigen Typ deklariert, so dass WithEvents inklusive der Programmierhilfe greifen kann

            Comment


            • #7
              Viele Dank,

              Ja da haben sie Recht.
              So geht es,

              Gruss

              PS: Ihre Beide Com Delphi Bücher hab ich schon:
              In Dt. Sprache scheint es einzelne "altes Delphi-Com-Testament und Delphi-Neues-Com Testament" zu sein...
              Danke

              Comment

              Working...
              X