c++ - 从 Windows 服务检测 SD 卡插入?

标签 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 - "The data area passed to a system call is too small.")

尽管调用相同,但在我的 Win32 窗口应用程序测试程序中没有出现此错误。

编辑:我已经通过使用 SERVICE_INTERACTIVE_PROCESS 标志注册服务解决了错误消息(某种程度上),但我仍然没有在我的 WndProc 中收到消息。

如果有任何帮助,我将不胜感激。

最佳答案

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

只需将 RegisterDeviceNotificationDEVICE_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/

相关文章:

c++ - C++14无符号整数溢出的进一步理解

c++ - 将 MPICH-1 源代码移植到 MPICH-2

windows - netsh winsock reset - 它的作用是什么?为什么我的无线网卡在使用该命令之前没有建立良好的连接?

c++ - C++中的文件读取问题

c++ - 在 DLL 中运行的工作线程在应用程序关闭时被杀死,然后才能正常关闭它们

iOS 蓝牙 BLE 连接到设备但显示服务为空

c++ - 为什么在一种情况下会发生内存泄漏,而在另一种情况下不会

android - 停止服务 "handler loop code"不起作用

rest - HTTP DELETE 方法幂等性

c++ - 为什么我可以在没有着色器的情况下渲染一个正方形?