Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Передача делегата в неуправляемый код как указатель на функцию

#c_sharp #pinvoke #interop


Имеется неуправляемый метод, который принимает указатель на функцию callback.

Определенный прототип выглядит так:

typedef SDL_HitTestResult (SDLCALL *SDL_HitTest)
                          (SDL_Window *win, const SDL_Point *area, void *data);


Думаю определение делегата должно быть соответственно таким:

delegate HitTestResult HitTestDelegate(IntPtr windowPtr,
                                       IntPtr pointAreaPtr, IntPtr userData);


Но тут теперь возникает вопрос, нужно ли данный делегат помечать как указатель на
неуправляемую функцию, т.е. ставить ему атрибут

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate HitTestResult HitTestDelegate(IntPtr windowPtr,
                                       IntPtr pointAreaPtr, IntPtr userData);


Т.к. стоит SDLCALL определнный как __cdecl.
    


Ответы

Ответ 1



Этот атрибут нужен не столько для указания того факта, что делегат нужно маршаллировать как указатель на функцию, сколько для указания соглашения о вызове. Соглашение вызова по умолчанию - stdcall, поэтому, если используется другое соглашение, естественно нужно это указать.

Ответ 2



Вот так? [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void MyFunctionDelegate(IntPtr frame); [DllImport("my.dll")] public extern static int MySetDataHandlerFunc( [MarshalAs(UnmanagedType.FunctionPtr)]MyFunctionDelegate functionCallback); https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.getdelegateforfunctionpointer?view=netframework-4.7.2 https://stackoverflow.com/questions/1969049/c-sharp-p-invoke-marshalling-structures-containing-function-pointers http://www.xinterop.com/index.php/2013/04/13/introduction-to-c-pinvoke-interop-sdk/

Комментариев нет:

Отправить комментарий