![]() |
C# Delegates in Delphi konsumieren
Hallo,
analog zu diesem Beispiel ![]() habe ich in VisualStudio2010 ein Com Object in C# erstellt, dessen Getter und Setter ich problemlos in Delphi7 konsumieren kann. Wie müsste man aber in C# Delegates so deklarieren, daß ich sie in der D7-Anwendung als Callback ansprechen kann? Gruß, Nic |
AW: C# Delegates in Delphi konsumieren
Eine Möglichkeit wäre sie sichtbar für COM zu machen:
![]() |
AW: C# Delegates in Delphi konsumieren
Ich glaube nicht, dass das geht.
Über COM kannst du nur Interfaces austauschen und keinen Zeiger auf eine Funktion. ggf. den Delegaten in ein Interface bzw. Objekt einwickeln. |
AW: C# Delegates in Delphi konsumieren
Außerhalb von COM gibt es da Wege, es gibt ja z.B.
![]() Aber eventuell muss man da mit VC++ eine mixed DLL schreiben, mit einer nativen und managed Seite. Die packt man dann zwischen Delphi und C#. ![]() |
AW: C# Delegates in Delphi konsumieren
VC++ ist nicht erforderlich, denn Delphi kann eben so DLL erzeugen.
Wichtig ist nur der Export der Funktionen. Allerdings passt dann das Beispiel bei Stackoverflow natürlich nicht mehr. PInvoke ist dann das Stichwort. |
AW: C# Delegates in Delphi konsumieren
Zitat:
[Edit] Also Delphi-EXE ruft (C-Seite) der VC++ DLL, diese verweist auf die C# DLL. Ein Delegate Aufruf aus C# landet in der VC++ DLL diese kann z.B. einen Callback aus der Delphi-Exe aufrufen. |
AW: C# Delegates in Delphi konsumieren
Zitat:
![]() |
AW: C# Delegates in Delphi konsumieren
Zitat:
Sieht nach einer Notlösung für einfache Fälle aus. Geht auch nur in die eine Richtung. Einen Custom RCW kriegt man da nur mit einer weiteren nativen Hilfs-DLL und viel Handarbeit hin. (Ja, es gibt auch ![]() bevor du einen chronischen Husten kriegst.) Auf Dinge wie die Marshalling-Lib und andere Dinge die es nur in VC++ Headern und Libs gibt müsste man dann verzichten. |
AW: C# Delegates in Delphi konsumieren
Basierend nach diesem Vorschlag
![]() Der C# Com-Server:
Code:
Und aus einer Delphi7 Client Anwendung:
using System;
using System.Runtime.InteropServices; using System.Threading; namespace ComDog { [ComVisible(false)] public delegate void DogEventHandler(); [ComVisible(true)] [Guid("2406DD50-A3CE-43A6-9F20-112B621CB784")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)] public interface IDogEvents { [DispId(1)] void Bark(); [DispId(2)] void Howl(); [DispId(3)] void Eat(); } [ComVisible(true)] [Guid("8C6DAD17-0612-4166-AD35-3A55DDEAF62E")] [ClassInterface(ClassInterfaceType.AutoDual)] [ComSourceInterfaces(typeof(IDogEvents))] public class Dog : MarshalByRefObject { [ComVisible(false)] private Timer _timer; public event DogEventHandler Bark; public event DogEventHandler Howl; public event DogEventHandler Eat; public Dog() { _timer = new Timer(new TimerCallback(timer_tick)); _timer.Change(5000, 2000); } private void timer_tick(object state) { MakeDogBark(); } public void MakeDogBark() { if (Bark != null) { Bark(); } } public void MakeDogHowl() { if (Howl != null) { Howl(); } } public void MakeDogEat() { if (Eat != null) { Eat(); } } } }
Code:
Erhalte ich 5sec nachdem der COM-Server instanziert wurde alle 2 sec das Event "Bark" angezeigt im Memo.
...
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComDog_TLB, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private protected procedure Barked(Sender: TObject); procedure Howled(Sender: TObject); procedure Ate(Sender: TObject); public end; var Form1: TForm1; TestDog: TDog; iDog: _Dog; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin iDog := CoDog.Create; TestDog := TDog.Create(self); TestDog.ConnectTo(iDog); TestDog.OnBark := Barked; TestDog.OnHowl := Howled; TestDog.OnEat := Ate; end; procedure TForm1.Barked(Sender: TObject); begin Memo1.Lines.Add('Event from COM: Dog Barked'); end; procedure TForm1.Howled(Sender: TObject); begin Memo1.Lines.Add('Event from COM: Dog Howled'); end; procedure TForm1.Ate(Sender: TObject); begin Memo1.Lines.Add('Event from COM: Dog ate something'); end; procedure TForm1.FormDestroy(Sender: TObject); begin if (TestDog <> nil) then TestDog.Free; end; ... Sieht gut aus oder ? Gruß, Nic |
AW: C# Delegates in Delphi konsumieren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz