Einzelnen Beitrag anzeigen

bert7

Registriert seit: 31. Jan 2010
3 Beiträge
 
#1

C# callback von Delphi-dll

  Alt 3. Feb 2010, 07:40
hallo,

im Rahmen einer C#-Anwendung soll eine Delphi-dll eine C#-Methode mit Parametern aufrufen, also ein "callback" Thema.
Dazu wird von der C# Anwendung die aufzurufende C#-Funktion in der Delphi-Dll registriert, ein Funktionspointer ("delegate") übergeben. Dazu wird noch ein Testparameter übergeben.

Der testparamter wird korrekt nach Delphi übertragen, aber beim Aufruf der callback -Methode von Delphi aus nach C# klappts nicht:
In C# kommt irgendein 8-stelliger Zufallswert an, meistens derselbe, aber nicht immer.

Hier der Code der Delphi-dll:

Code:

type TCallback = procedure(val: integer);
var callback : TCallback;



procedure RegisterCallback(aCallback : TCallback; value: integer); stdcall;
begin
  callback:= aCallback; // registrieren...
  ShowMessage('In Delphi:'+ IntToStr(value)); // erfolgreich wird "10" ausgegeben

  callback(value); // ...und gleich testen
end;

exports
  RegisterCallback;
Und hier der C#-Code

Code:

    public partial class Form1 : Form
    {
        public delegate void ProcDelegate(int value);

        [DllImport("DLLTest.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern void RegisterCallback(ProcDelegate callBackHandle, int value);


        public Form1()
        {
            InitializeComponent();

            RegisterCallback(CalledFromDelphi,10);// in delphi registrieren, "10" als test mitgeben

        }

        public static void CalledFromDelphi(int value)
        {
            MessageBox.Show("Wert:" + value); // kommt leider nicht "10" an, sondern ein "Zufalls?"-Wert

        }
    }
Erwähnenswert ist noch dass die Messagebox in C# zweimal aufgerufen wird, beidesmal mit großen "Zufalls?"-zahlen, obwohl offensichtlich der callback nur einmal von Delphi aus aufgerufen wird.

Weiss leider nicht , auf welcher Seite die Fehler liegen, vermutlich eher auf C#-Seite ?

Danke.
Bert
  Mit Zitat antworten Zitat