从Delphi dll到C#app的回调

时间:2010-02-06 08:50:55

标签: c# delphi dll callback

在c#应用程序中,带有参数的c#-method将从delphi dll中调用: 调用C#方法,但int参数未正确传输:某些“随机”值到达。

C#-method通过寄存器方法传递给delphi dll:

    [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 个答案:

答案 0 :(得分:4)

尝试

type TCallback = procedure(val: integer); stdcall;

答案 1 :(得分:0)

发现错误:

在Delphi中忘了“stdcall”:

输入TCallback = procedure(val:integer); STDCALL;