Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - C# to Delphi Schnittstelle


ts_dev - Sa 02.10.21 10:24
Titel: C# to Delphi Schnittstelle
Hallo zusammen,

ich bin am Verzweifeln und brauche ein wenig Hilfe.

Ich muss in altes Delphi Programm ein Update vornehmen.

In C# sieht mein Code folgendermaßen aus:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
private void StartInBackground()
{
    _phoneListener = new ScreenPopTelephoneListener();

    _phoneListener.Initialize("6000@XXX");

    _phoneListener.StartListening("000");

    _phoneListener.ScreenPop += new _IScreenPopTelephoneListenerEvents_ScreenPopEventHandler(ScreenPopEvent);

    this.Shutdown += new HiPathScreenPop_ShutdownEventHandler(HiPathScreenPop_Shutdown);
}

private void ScreenPopEvent(ScreenPopTelephoneEvent screenpoptelephoneevent)
{
    Console.WriteLine(screenpoptelephoneevent.From);

    Console.WriteLine(screenpoptelephoneevent.Destination);

    Console.WriteLine(screenpoptelephoneevent.QueueName);
}

Leider habe ich keine Ahnung wie das in Delphi gelöst wird und finde per Google kein passendes Beispiel.

In Delphi 10.4 wurde mir die beigefügte TLB generiert.
 
Delphi:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var Listener : ScreenPopTelephoneListener;

...

Listener := CoScreenPopTelephoneListener.Create;

Listener.Initialize('6000@XXX');

Listener.StartListening('000');

Wie kann ich auf das Event ScreenPop in Delphi reagieren? (Function)

Vielen Dank im voraus.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
Moderiert von user profile iconTh69: Topic aus Dateizugriff verschoben am Sa 02.10.2021 um 14:28


Th69 - Sa 02.10.21 14:21

Hallo und :welcome:

ein Ereignis zuweisen geht in Delphi fast analog zu C# (oder anderen Sprachen), nur daß hier kein Eventhandler hinzugefügt, sondern nur zugewiesen werden muß (Delphi kennt kein Multicast-Event), s.a. Ereignisse (Delphi) [https://docwiki.embarcadero.com/RADStudio/Sydney/de/Ereignisse_(Delphi)].
Bei dir also

Delphi-Quelltext
1:
Listener.ScreenPop := ScreenPopEvent;                    

Der Eventhandler ScreenPopEvent muß natürlich dann die passende Signatur besitzen.

PS: Auch in C# reicht ein einfaches

C#-Quelltext
1:
_phoneListener.ScreenPop += ScreenPopEvent;                    


ts_dev - Sa 02.10.21 15:42

Hallo Th69,

vielen Dank für die schnelle Antwort.

Ja, so hatte ich es schon probiert und wäre es für mich auch logisch gewesen, jedoch wird mir die Function beim Listener gar nicht angezeigt.

In der Komponente ist ScreenPop nur als dispinterface vorhanden unter _IScreenPopTelephoneListenerEvents. Wie komme ich da ran?

Wenn ich es wie folgt eingebe:

Delphi-Quelltext
1:
Listener.ScreenPop := ScreenPopEvent;                    

erhalte ich diese Fehlermeldungen:

Zitat:
[dcc32 Fehler] Unit1.pas(70): E2003 Undeklarierter Bezeichner: 'ScreenPop'
[dcc32 Fehler] Unit1.pas(70): E2035 Nicht genügend wirkliche Parameter
[dcc32 Fataler Fehler] ScreenPop.dpr(5): F2063 Verwendete Unit 'Unit1.pas' kann nicht compiliert werden


Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
Moderiert von user profile iconTh69: Quote-Tags hinzugefügt


Th69 - So 03.10.21 10:35

Sorry, habe nicht erkannt, daß es sich dabei um eine COM-Library handelt (statt 2 getrennter Implementierungen für .NET und Delphi).

Damit habe ich leider auch keine Erfahrung.
Ich habe aber folgenden umfangreichen Artikel dazu gefunden: Automation in Delphi COM Programming: COM Events and Callbacks [https://www.informit.com/articles/article.aspx?p=130494&seqNum=5] (wenn ich das richtig verstanden habe, müßte das letzte Beispiel, ab "Creating the Client" das für dich passende sein).
Trotzdem verstehe ich auch nicht, wie man die beiden Klassen (bzw. Interfaces) ScreenPopTelephoneListener und _IScreenPopTelephoneListener dann verbinden kann (in dem Beispiel wird das entsprechende Event beim Connect an den Server als Parameter übergeben).

Edit: Ich habe noch mal etwas nachgeforscht. Bei .NET funktioniert das anscheinend mittels des Attributs ComSourceInterfaces, s. z.B. Supporting COM Events from a Managed Class [https://limbioliong.wordpress.com/2011/11/18/supporting-com-events-from-a-managed-class/].
Für Delphi habe ich noch Supporting automation events in Delphi [http://www.gtro.com/delphi/comevents_e.php] sowie COM, COM events, .NET and some Delphi [http://codebetter.com/petervanooijen/2005/08/31/com-com-events-net-and-some-delphi/] (beiden letzten Absätze) gefunden - such mal selber nach TEventSink.

Ansonsten mußt du mal beim Siemens Support nachfragen bzgl. _IScreenPopTelephoneListenerEvents für die Benutzung mit Delphi.