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