我需要从 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 - "The data area passed to a system call is too small.")
尽管调用相同,但在我的 Win32 窗口应用程序测试程序中没有出现此错误。
编辑:我已经通过使用 SERVICE_INTERACTIVE_PROCESS
标志注册服务解决了错误消息(某种程度上),但我仍然没有在我的 WndProc 中收到消息。
如果有任何帮助,我将不胜感激。
最佳答案
即使我在这里复活旧线程:
只需将 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
关于c++ - 从 Windows 服务检测 SD 卡插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14607564/