Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi c# to Delphi Schnittstelle (https://www.delphipraxis.net/208938-c-delphi-schnittstelle.html)

Shortybabe_1985 1. Okt 2021 20:16

c# to Delphi Schnittstelle
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend,

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:

private void StartInBackground()
{
_phoneListener = new ScreenPopTelephoneListener();
_phoneListener.Initialize("6000@XXX");
_phoneListener.StartListening("000");

_phoneListener.ScreenPop += new _IScreenPopTelephoneListenerEvents_ScreenPopEventH andler(ScreenPopEvent);
this.Shutdown += new HiPathScreenPop_ShutdownEventHandler(HiPathScreenP op_Shutdown);
}

private void ScreenPopEvent(ScreenPopTelephoneEvent screenpoptelephoneevent)
{
Console.WriteLine(screenpoptelephoneevent.From);
Console.WriteLine(screenpoptelephoneevent.Destinat ion);
Console.WriteLine(screenpoptelephoneevent.QueueNam e);
}

Leider habe ich keine Ahnung wie das in Delphi gelöst wird.

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

Delphi:
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.

TiGü 6. Okt 2021 09:49

AW: c# to Delphi Schnittstelle
 
Gibt es dazu noch irgendwie Doku oder so?

Ansonsten ein Schuss ins Blaue:

Delphi-Quellcode:
unit Unit3;

interface

uses
    Winapi.Windows, System.SysUtils, System.Classes,
    Vcl.Controls, Vcl.Forms, HiPathProCenterScreenPopAPILibrary_TLB;

type
    // musste ich jetzt selbst anlegen, gab es nur den dispinterface-Typen für???
    IScreenPopTelephoneListenerEvents = interface
        ['{65CA62A4-921C-48B4-A4AA-20739C0F8EDA}']
        function ScreenPop(const ScreenPopTelephoneEvent: IScreenPopTelephoneEvent): HResult; safecall;
        function StatusChanged(newStatus: enListenerStatus): HResult; safecall;
    end;

    TForm3 = class(TForm, IScreenPopTelephoneListenerEvents)
    private
        procedure StartInBackground;
    public
        function ScreenPop(const ScreenPopTelephoneEvent: IScreenPopTelephoneEvent): HRESULT; safecall;
        function StatusChanged(newStatus: enListenerStatus): HResult; safecall;
    end;

var
    Form3: TForm3;

implementation

{$R *.dfm}

{ TForm3 }

procedure TForm3.StartInBackground;
var
    Listener: ScreenPopTelephoneListener;
    Events: _IScreenPopTelephoneListenerEvents;
    ScreenPopEvent: IScreenPopTelephoneEvent;
begin
    Listener := CoScreenPopTelephoneListener.Create;
    Listener.Initialize('6000@XXX');
    Listener.StartListening('000');

    // Unklar, Doku fehlt! Wahrscheinlich eher nicht so gemeint!
    if Supports(Listener, _IScreenPopTelephoneListenerEvents, Events) then
    begin
        ScreenPopEvent := CoScreenPopTelephoneEvent.Create;
        Events.ScreenPop(ScreenPopEvent)
    end
    else
    begin
        // Eher der logischere Weg. Du implementierst das IScreenPopTelephoneListenerEvents selbst und
        // meldest es am Listener an, aber dafür fehlt eine Add- oder Register-Funktion in der importierten TLB-Unit.
        // Siehe auch die Konstanten SCREENPOP_CanNot_Register und SCREENPOP_Already_Registered
        // Also so zum Beispiel:
        Listener.AddEventListener(Self);
        oder
        Listener.RegisterEvents(Self);
    end;
end;

function TForm3.ScreenPop(const ScreenPopTelephoneEvent: IScreenPopTelephoneEvent): HRESULT;
begin
    OutputDebugString(PChar(ScreenPopTelephoneEvent.From));
    OutputDebugString(PChar(ScreenPopTelephoneEvent.Destination));
    OutputDebugString(PChar(ScreenPopTelephoneEvent.QueueName));
    Result := S_OK;
end;

function TForm3.StatusChanged(newStatus: enListenerStatus): HResult;
begin

end;

end.

Shortybabe_1985 12. Okt 2021 12:25

AW: c# to Delphi Schnittstelle
 
Liste der Anhänge anzeigen (Anzahl: 1)
Oh wow, vielen Dank für die Rückmeldung.

Leider funktioniert dies auch nicht.

Ja es gibt eine Doku, diese findest du im Anhang.

Noch Ideen?

TiGü 18. Okt 2021 09:44

AW: c# to Delphi Schnittstelle
 
Hm, wenn IScreenPopTelephoneListener das _IScreenPopTelephoneListenerEvents nicht unterstützt und in meinen Augen die Doku wenig Licht ins Dunkel bringt, würde ich an deiner Stelle an Unify mal eine Support Mail schreiben.
Vielleicht ist deren TLB auch nicht ganz richtig oder du hast beim Import was falsch angehakt.
So richtig klar ist das Beispiel auf Seite 38 nicht.

Vielleicht können sie dir ein Minimal-Beispiel schicken, was auf einer importierten TLB in einer nativen Sprache basiert?!

generic 18. Okt 2021 13:25

AW: c# to Delphi Schnittstelle
 
Wenn du da mit Delphi nicht weiter kommst, dann entwickle das in C#.
In C# baust du dir dann eine C API oder einen COM-Server, welche(n) du dann in Delphi nutzt.
Ein Webservice wäre auch noch eine Variante, da macht der Callback aber kein Spaß.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz