#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/
Комментариев нет:
Отправить комментарий