Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top