Как реализовать обратный вызов из Windows API для Windows в C #? - PullRequest
1 голос
/ 17 июня 2011

У меня есть встроенная функция API, которая выглядит следующим образом:

DWORD WINAPI WlanRegisterNotification(
  __in        HANDLE hClientHandle,
  __in        DWORD dwNotifSource,
  __in        BOOL bIgnoreDuplicate,
  __in_opt    WLAN_NOTIFICATION_CALLBACK  funcCallback,
  __in_opt    PVOID pCallbackContext,
  __reserved  PVOID pReserved,
  __out_opt   PDWORD pdwPrevNotifSource
);

Я перевел это на C # как:

[DllImport("Wlanapi.dll", EntryPoint = "WlanRegisterNotification")]
public static extern uint WlanRegisterNotification(
     IntPtr hClientHandle, WLAN_NOTIFICATION_SOURCE dwNotifSource,
     bool bIgnoreDuplicate, WLAN_NOTIFICATION_CALLBACK funcCallback,
     IntPtr pCallbackContext, IntPtr pReserved,
     [Out] out WLAN_NOTIFICATION_SOURCE pdwPrevNotifSource);

Функция обратного вызова выглядит следующим образом:

typedef VOID ( WINAPI *WLAN_NOTIFICATION_CALLBACK)(
  PWLAN_NOTIFICATION_DATA data,
  PVOID context
);

Я предполагаю, что версия C # будет выглядеть примерно так:

public delegate void WLAN_NOTIFICATION_CALLBACK(
    IntPtr pWlanNotificationData, IntPtr pContext)

По сути, у меня есть два вопроса:

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

И если так, будет ли это автоматически вызывать делегата в c # при получении уведомления?

1 Ответ

2 голосов
/ 17 июня 2011

Да, вы должны использовать делегата, и да, он будет работать нормально.

Однако вы должны убедиться, что GC не собирает ваш экземпляр делегата. (как правило, положив его в поле)

...