Question

J'ai une fonction API native qui ressemble:

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
);

Je l'ai traduit en c # comme:

[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);

La fonction de rappel ressemble:

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

Je suppose que la version C # ressemblera à quelque chose:

public delegate void WLAN_NOTIFICATION_CALLBACK(
    IntPtr pWlanNotificationData, IntPtr pContext)

Essentiellement, j'ai deux questions:

Un délégué est-il le bon objet à utiliser pour une méthode native qui attend un pointeur de fonction?

Et si oui, cela appellera-t-il automatiquement le délégué en C # lorsque la notification sera reçue?

Était-ce utile?

La solution

Oui, vous devez utiliser un délégué, et oui, cela fonctionnera bien.

Cependant, vous devez vous assurer que le GC ne collecte pas votre instance de délégué. (généralement en le mettant dans un champ)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top