C#でWindowsネイティブAPIからのコールバックを実装するにはどうすればよいですか?
質問
次のように見えるネイティブ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がデリゲートインスタンスを収集しないことを確認する必要があります。 (通常、それをフィールドに置くことによって)
所属していません StackOverflow