Мне нужно обнаружить вставку съемного носителя из службы 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 — «Область данных передана в систему
звонок слишком мал. «)
Эта ошибка не возникает в моей тестовой программе Windows, несмотря на идентичные вызовы.
Изменить: Я решил сообщение об ошибке (вроде), зарегистрировав службу с 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
Других решений пока нет …