Обнаружить вставку SD-карты из службы Windows?

Мне нужно обнаружить вставку съемного носителя из службы 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.

Я был бы очень признателен за любую помощь.

2

Решение

Даже если я возрождаю старые темы здесь:

просто используйте 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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]