Использование RAPI в службе Windows

Для доступа к устройствам Windows CE из моего настольного приложения я использовал самописную DLL. Эта DLL использовала RAPI для вызова необходимых функций на стороне устройства. Все работает отлично в течение многих лет.

Но теперь я хотел использовать эту DLL в службе Windows. И это не удалось. Отладка показывает, что это функция CeRapiInitEx(), которая не работает. И до сбоя он блокируется примерно на 5 секунд, хотя MSDN говорит, что это асинхронная неблокирующая функция. GetLastError() дает мне 1444L "Неверный идентификатор потока".

Кто-то в Интернете упомянул, что RAPI не работает из служебных потоков в ActiveSync 4. Хотя информация скудная и скудная.

У кого-нибудь есть такая же проблема или просто есть что сказать? Правда ли, что RAPI недоступен из службы Windows? Если так, есть ли обходные пути?

1 ответ

Решение

Возможные решения этой проблемы:

  1. Понизьте ActiveSync до версии 3.8 и дайте сервису разрешение на взаимодействие с рабочим столом (для этого используйте апплет системных служб).
  2. Создайте другой пользовательский процесс ( CreateProcessAsUser) и используйте его в качестве промежуточного слоя между службой и RAPI (т. Е. Выполните все вызовы RAPI в этом процессе).
  3. Создайте другое пользовательское (не сервисное) приложение и используйте его в качестве промежуточного слоя между сервисом и RAPI (т. Е. Выполните все вызовы RAPI в этом приложении).
  4. Запустите сервисный код как обычное (например, консольное) приложение.
  5. Переключение с RAPI на другой интерфейс для связи с устройством, например, TCP.

Я выбрал 1-е, лично, так как это наиболее подходит в моем случае.

Другие вопросы по тегам