Указатель на делегат

  • Автор темы Red Wind
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

Red Wind

#1
С праздником!
У меня есть определённый делегат. Нужно получить указатель на на этот делегат, что бы использовать в unmenaged коде. Вообще в framework 2.0 есть специальный метод Marshal.GetFunctionPointerForDelegate. Но мне нужно обойдтись возможностями первого фрэймворка. Скажите, как это мождно сделать?
 
R

Red Wind

#2
Извиняюсь, скорее всего я немного запутался с постановкой задачи:p. Нужно полчить не указатель на делегат, а просто указатель на нейкий метод и положить этот указатель в класс IntPtr. Вот. Просто во втором фрэймворке имея возможность воспользоваться Marshal.GetFunctionPointerForDelegate это делается через делегаты.
 
R

Red Wind

#3
Вот наткнулся на такаие методы как
System.Runtime.InteropServices.Marshal.GetManagedThunkForUnmanagedMethodPtr
System.Runtime.InteropServices.Marshal.GetUnmanagedThunkForManagedMethodPtr

Вот что написано в MSDN:

[ObsoleteAttribute("The GetManagedThunkForUnmanagedMethodPtr method has been deprecated and will be removed in a future release.", false)]
public static IntPtr GetManagedThunkForUnmanagedMethodPtr (
IntPtr pfnMethodToWrap,
IntPtr pbSignature,
int cbSignature
)

Parameters
pfnMethodToWrap
A pointer to the method to marshal.

pbSignature
A pointer to the method signature.

cbSignature
The number of bytes in pbSignature.

Return Value
A pointer to the thunk that will marshal a call from the pfnMethodToWrap parameter.

Вроде по описанию похоже на то что нужно. Но проблема в том, что нет никакой документации по ним. Пока у меня не получилось разобраться с тем как их применять. Например, как получить указатель на метод и его сигнатуру?
 
M
#4
Пример передачи указателя функции в анменеджед код:

[DllImport("user32.dll")]
static extern IntPtr SetWindowsHookEx(HookType hook, HookProc callback,
IntPtr hMod, uint dwThreadId);

delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);

public enum HookType : int
{
WH_JOURNALRECORD = 0,
WH_JOURNALPLAYBACK = 1,
WH_KEYBOARD = 2,
WH_GETMESSAGE = 3,
WH_CALLWNDPROC = 4,
WH_CBT = 5,
WH_SYSMSGFILTER = 6,
WH_MOUSE = 7,
WH_HARDWARE = 8,
WH_DEBUG = 9,
WH_SHELL = 10,
WH_FOREGROUNDIDLE = 11,
WH_CALLWNDPROCRET = 12,
WH_KEYBOARD_LL = 13,
WH_MOUSE_LL = 14
}
 
Статус
Закрыто для дальнейших ответов.