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

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

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

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

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


person Alex Che    schedule 18.02.2010    source источник


Ответы (1)


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

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

Лично я выбрал 1-й, так как он наиболее подходит для моего случая.

person Alex Che    schedule 19.02.2010