Обратный звонок из Delphi dll в приложение C # - PullRequest
6 голосов
/ 06 февраля 2010

Внутри приложения c # метод c # с параметром должен вызываться из библиотеки delphi: Метод C # вызывается, но параметр int передается неправильно: поступает какое-то «случайное» значение.

Метод C # передается в библиотеку delphi с помощью метода регистра:

    [UnmanagedFunctionPointer(CallingConvention.ThisCall)]
    public delegate void ProcDelegate(int value);

    private static ProcDelegate procDelegate;

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


    public Form1()
    {
        InitializeComponent();

        procDelegate = new ProcDelegate(CalledFromDelphi);

        RegisterCallback(procDelegate, 10); // register in delphi dll


    }

    public static void CalledFromDelphi(int value)
    {
        MessageBox.Show("Value:" + value); // expect "10", but getting random value

    }

А вот код delphi :

type TCallback = procedure(val: integer);
var callback : TCallback;
procedure RegisterCallback(aCallback : TCallback; value: integer); stdcall;
begin
  callback:=  aCallback; 
  ShowMessage('Inside Delphi:'+ IntToStr(value)); // successful ("10")

  callback(value);  // ...and test callback
end;

exports
  RegisterCallback;

Что также интересно: метод обратного вызова вызывается дважды (оба раза приходит «случайное» значение), хотя он вызывается только один раз в коде. После этого происходит сбой приложения с кодом выхода (0xc0000005).

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 06 февраля 2010

Попробуйте

type TCallback = procedure(val: integer); stdcall;
0 голосов
/ 06 февраля 2010

обнаружил ошибку:

забыл "stdcall" в Delphi:

тип TCallback = процедура (val: целое число); STDCALL;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...