Передача указателя метода из C # в Delphi DLL - PullRequest
3 голосов
/ 11 ноября 2010

У меня были некоторые проблемы с передачей строки как PChar в встроенную DLL-библиотеку Delphi, и я решил ее благодаря Jens Mühlenhoff.

Теперь у меня есть другая проблема -

Я сделал успешный обратный вызовметода c # при передаче в DLL, если объявление Delphi является обычной процедурой типа, но если объявление Delphi является процедурой типа метода, я получаю сообщение об ошибке «Попытка чтения или записи в защищенную память».

Я попытался найти ...

Вот объявление Delphi

TCallBack = procedure ( s : String) of object;stdcall;

Вот код C #

[DllImport(
    "DLLTest.dll",
    CallingConvention = CallingConvention.StdCall,
    CharSet = CharSet.Ansi,
    EntryPoint = "DLL_Test"
)]
public static extern void DLL_Test(IntPtr p, [MarshalAs(UnmanagedType.LPStr)] string Location, int AIntValue);

public delegate void MethodCallBackEvent(string s);
public event MethodCallBackEvent Info;

public void GetInfo(string s)
{
    MessageBox.Show("Info: " + s);
}

, используемый как

            Info = GetInfo; //or Info = new MethodCallBackEvent(GetInfo);
            IntPtr p = Marshal.GetFunctionPointerForDelegate(Info);

            DLL_Test(p, "location message", 10);

1 Ответ

8 голосов
/ 11 ноября 2010

Вот рабочий пример.DllTest1 использует нормальный обратный вызов функции.DllTest2 ожидает обратный вызов как прямой указатель на функцию C # (требуется небольшой взлом на стороне Delphi), а DllTest3 ожидает указатель обратного вызова метода Delphi (требует небольшой взлом на стороне C #).

...