Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Event in Dll in Delphi in einem C# Programm


ebber - Do 09.10.08 16:52
Titel: Event in Dll in Delphi in einem C# Programm
Hallo,

ich war mir nicht so sicher, aber ich glaube das passt mehr ins Delphi Forum wie ins C#.
Ich habe eine Dll in Delphi und habe darin ein Event von einer Komponente. Wie genau muss ich das jetzt deklarieren oder sowas um von meinem C# Programm(oder überhaupt von außen) Zugriff darauf zu bekommen? Geht das überhaupt?

MfG


Klabautermann - Mo 13.10.08 16:07

Hallo,

ich denke der erste Schritt heist erst einmal Callback-Funktion. Hier findest du ein kleines Beispiel: http://www.delphi-forum.de/viewtopic.php?p=386566

Vom Prinziep läuft es so, du übergibst deiner DLL "zur Initialisierung" die Adresse der Funktion aus deinem Programm, welche bei dem Event ausgelöst werden soll. In deiner DLL schreibst du einen Eventhandler und vernüpfst ihn mit dem entsprechenden Ereigniss. Dieser macht dann nichts anderes als die Funktion, welche an der ihr bekannten Adresse liegt auf zu rufen.

Wie dass dann aus C# funktioniert ist eine Frage für das C#-Forum ;).

Gruß
Klabautermann


ebber - Do 16.10.08 14:22

Ok, scheint mir genau das zu sein was ich brauche. Danke.

Wenn ich nicht rausfinde wie das in C# funktioniert werde ich dort wohl mal Fragen.

MfG


ebber - Sa 25.10.08 18:22

Hallo,

ich dachte ich sollte nochmal schreiben wie das jetzt funktioniert:

Delphi Dll Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
TCallBack = procedure (count : integer); stdcall;

CallMainApp : TCallBack;

procedure onEvent();
begin
  CallMainApp(5);
end;

function SetCallback(CallBackFunction: TCallBack): Boolean; stdcall;
begin
      if Assigned(CallBackFunction) then
      begin
        CallMainApp := CallBackFunction;
        result := true;
      end
      else
        result := false;

end;


C# Programm Code:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
        [DllImport("Cappi.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void SetCallback(MulticastDelegate callback);

        public delegate void CallbackDelegate(int count);


        private void button1_Click(object sender, RoutedEventArgs e)
        {
            CallbackDelegate del = new CallbackDelegate(Callback);
            SetCallback(del);
        }


        private static void Callback(int count)
        {
            Console.WriteLine("Param from Callback :" + count);
        }



Ich hoffe es hilft jemand.

MfG