2

次のようなネイティブ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)

基本的に、2 つの質問があります。

デリゲートは、関数ポインターを期待するネイティブ メソッドに使用する正しいオブジェクトですか?

もしそうなら、これは通知が受信されたときにC#でデリゲートを自動的に呼び出しますか?

4

1 に答える 1

3

はい、デリゲートを使用する必要があります。はい、正常に機能します。

ただし、GC がデリゲート インスタンスを収集しないようにする必要があります。(通常、フィールドに配置することによって)

于 2011-06-17T14:19:30.633 に答える