2

Windows サービスからのリムーバブル メディアの挿入を検出する必要があります。目に見えないウィンドウを使用して、USB サムドライブを正常に検出できますRegisterDeviceNotificationが、SD カードはより困難であることが証明されています。を使用するコードを見つけましSHChangeNotifyRegisterたが、さらに調査したところ、ウィンドウ アプリケーションからしか動作させることができませんでした。

(codeproject から見つかったコード: http://www.codeproject.com/Articles/3946/Trapping-windows-messages?msg=2897423#xx2897423xx )

namespace globals{
    SHChangeNotifyEntry shcne[1];
}
...

globals::shcne[0].pidl = NULL;
globals::shcne[0].fRecursive = TRUE;

globals::hNotify = SHChangeNotifyRegister(globals::hwnd, SHCNE_DISKEVENTS, 
                                          SHCNE_MEDIAINSERTED | SHCNE_MEDIAREMOVED,      
                                          WM_MEDIA_CHANGE, 1, globals::shcne);

私が受け取るエラーは

122 (ERROR_INSUFFICIENT_BUFFER - "システム コールに渡されたデータ領域が小さすぎます。")

このエラーは、呼び出しが同一であるにもかかわらず、私の Win32 ウィンドウ アプリケーション テスト プログラムでは発生しません。

編集: サービスにフラグを登録することでエラー メッセージ (一種) を解決しましたSERVICE_INTERACTIVE_PROCESSが、WndProc でメッセージをまだ受信していません。

助けていただければ幸いです。

4

1 に答える 1

1

ここで古いスレッドを復活させたとしても:

を使用RegisterDeviceNotificationするだけでDEVICE_NOTIFY_SERVICE_HANDLE、(もちろん) ControlHandlerをRegisterServiceCtrlHandlerExを介して登録する必要があります。これには serviceName が必要です。サービスを開始する前に、このハンドルを登録する必要があることを忘れないでください (@ MSDN にも言及)。関数ポインタを に安全にキャストできますLPHANDLER_FUNCTION_EX。これらのキャストは通常​​、関数シグネチャが MSDN の例と一致する限り安全です。

GUID_DEVINTERFACE_SMARTCARD_READER最後に、パラメータとして使用できるようになりましたRegisterDeviceNotification

コールバックには次の署名が必要です: http://msdn.microsoft.com/en-us/library/windows/desktop/ms683241(v=vs.85).aspx

于 2014-08-11T14:16:28.763 に答える