Использование RAPI в службе Windows
-
21-09-2019 - |
Вопрос
Для доступа к устройствам Windows CE из моего настольного приложения я использовал самописную DLL.Эта DLL использовала RAPI для вызова необходимых функций на стороне устройства.Все работает нормально уже много лет.
Но теперь я захотел использовать эту DLL в службе Windows.И это не удалось.Отладка показывает, что сбой вызывает функция CeRapiInitEx().И перед сбоем он блокируется примерно на 5 секунд, хотя MSDN говорит, что это асинхронная неблокирующая функция.GetLastError() выдает мне 1444L «Неверный идентификатор потока».
Кто-то в Интернете упомянул, что RAPI не работал из служебных потоков в ActiveSync 4.Хотя информация скудная и обрывочная.
Есть ли у кого-нибудь такая же проблема или просто есть что сказать?Правда ли, что RAPI недоступен из службы Windows?Если да, есть ли обходные пути?
Решение
Возможные решения этой проблемы:
- Понизьте версию ActiveSync до версии 3.8 и дайте службе разрешение на взаимодействие с рабочим столом (используйте для этого апплет системных служб).
- Создать другой пользовательский процесс (CreateProcessAsUser) и использовать его в качестве промежуточного слоя между сервисом и RAPI (т. е. выполнять все вызовы RAPI в этом процессе).
- Создайте другое пользовательское (несервисное) приложение и используйте его в качестве промежуточного слоя между сервисом и RAPI (т. е. делайте все вызовы RAPI в этом приложении).
- Запустите сервисный код как обычное (например, консольное) приложение.
- Переключитесь с RAPI на другие интерфейсы для связи с устройством, например.ПТС.
Лично я выбрал 1-й, так как он наиболее подходит в моем случае.