C#でWindowsネイティブAPIからのコールバックを実装するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/6387173

  •  29-10-2019
  •  | 
  •  

質問

次のように見えるネイティブ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#の代表者を自動的に呼び出すでしょうか?

役に立ちましたか?

解決

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top