检测从Windows服务插入SD卡?

时间:2013-01-30 15:28:23

标签: c++ windows service sd-card

我需要检测Windows服务中的可移动媒体插入。使用不可见的窗口,我可以使用RegisterDeviceNotification成功检测到USB拇指驱动器,但SD卡证明更加困难。我发现使用SHChangeNotifyRegister的代码,但经过进一步调查,我只能从窗口应用程序中获取它。

(代码找到代码项目: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中接收消息。

我非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

即使我在这里复活旧线程:

只需将RegisterDeviceNotificationDEVICE_NOTIFY_SERVICE_HANDLE一起使用,您(当然)必须通过ControlHandler注册您需要服务名称的RegisterServiceCtrlHandlerEx - 并且不要忘记在您启动服务之前需要注册此句柄(也提到@ MSDN)。您可以安全地将函数指针强制转换为LPHANDLER_FUNCTION_EX,只要您的函数签名与MSDN示例匹配,这些强制转换通常是安全的。

最后,您现在可以使用GUID_DEVINTERFACE_SMARTCARD_READER作为RegisterDeviceNotification

的参数

您的回调必须有此签名:http://msdn.microsoft.com/en-us/library/windows/desktop/ms683241(v=vs.85).aspx