Использование RAPI в службе Windows - PullRequest
1 голос
/ 18 февраля 2010

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

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

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

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

1 Ответ

1 голос
/ 19 февраля 2010

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

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

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

...