Windowsでドライブの追加・削除を検知する Part2

「WM_DEVICECHANGE」メッセージを拾うことで検知可能なのですが。

Win32のコーディングをSDKでする時に、メッセージクラッカーを使うと非常に便利なんで「WM_DEVICECHANGE」用の定義も「windowsx.h」あります。

↓こんなコード
/* BOOL Cls_OnDeviceChange(HWND hwnd, UINT uEvent, DWORD dwEventData) */
#define HANDLE_WM_DEVICECHANGE(hwnd, wParam, lParam, fn) \
(LRESULT)(DWORD)(BOOL)(fn)((hwnd), (UINT)(wParam), \
(DWORD)(wParam))

#define FORWARD_WM_DEVICECHANGE(hwnd, uEvent, dwEventData, fn) \
(BOOL)(DWORD)(fn)((hwnd), WM_DEVICECHANGE, (WPARAM)(UINT)(uEvent), \
(LPARAM)(DWORD)(dwEventData))
はーい、太字のところ注目!!
はい、たぶんバグです。きっとバグです。
ここを「lParam」に修正すると意図どおりに動きました。

MS提供のソースを修正するのもなんだったので↓の用に自分のプロジェクト内でいったんundefして、再定義しました。
//バグっぽいのでいったん削除
#undef HANDLE_WM_DEVICECHANGE
#undef FORWARD_WM_DEVICECHANGE

/* BOOL Cls_OnDeviceChange(HWND hwnd, UINT uEvent, DWORD dwEventData) */
#define HANDLE_WM_DEVICECHANGE(hwnd, wParam, lParam, fn) \
(LRESULT)(DWORD)(BOOL)(fn)((hwnd), (UINT)(wParam), \
(DWORD)(lParam))

#define FORWARD_WM_DEVICECHANGE(hwnd, uEvent, dwEventData, fn) \
(BOOL)(DWORD)(fn)((hwnd), WM_DEVICECHANGE, (WPARAM)(UINT)(uEvent), \
(LPARAM)(DWORD)(dwEventData))