【问题标题】:Callback from Delphi dll to C# app从 Delphi dll 回调到 C# 应用程序
【发布时间】:2010-02-06 08:50:55
【问题描述】:

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

C#方法通过注册方法传递给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)。

有什么想法吗?

【问题讨论】:

    标签: c# delphi dll callback


    【解决方案1】:

    试试

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

    【讨论】:

      【解决方案2】:

      发现错误:

      在 Delphi 中忘记了“stdcall”:

      type TCallback = procedure(val: integer);标准调用;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        • 1970-01-01
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        相关资源
        最近更新 更多