В c# приложении c#-method с параметром нужно назвать от Дельфи dll: метод C# называют, но международный параметрический усилитель не передан правильно: некоторое "случайное" значение прибывает.
C#-method передается Дельфи 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
}
И вот код Дельфи:
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).
Какая-либо идея?
Попробуйте
type TCallback = procedure(val: integer); stdcall;
обнаружил ошибку:
забыл "stdcall" в Delphi:
type TCallback = procedure (val: integer); stdcall;