Pergunta

Para acessar os dispositivos Windows CE no meu aplicativo de desktop, usei DLL auto-escrita. Essa DLL usou o RAPI para chamar as funções necessárias no lado do dispositivo. Tudo está funcionando bem há anos.

Mas agora eu queria usar essa DLL no serviço Windows. E falhou. A depuração mostra que é a função Cerapiinitex () que falha. E antes de falhar, ele bloqueia por cerca de 5 segundos, embora o MSDN diga que é uma função assíncrona não bloqueadora. GetLasterror () me dá 1444L "Identificador de thread inválido".

Alguém na Internet mencionou que o RAPI não funcionou em tópicos de serviço no ActiveSync 4. Embora as informações sejam ruins e desorganizadas.

Alguém tem o mesmo problema ou apenas tem algo a dizer? É verdade que o Rapi não está acessível a partir do serviço Windows? Se sim, existem soluções alternativas?

Foi útil?

Solução

Possíveis soluções para este problema:

  1. Downgrade ActiveSync para a versão 3.8 e forneça a permissão de serviço para interagir com o desktop (use o applet de serviços do sistema para isso).
  2. Gerar outro processo de usuário (CreateProcesSasUser) e use -o como intercalador entre o Serviço e o Rapi (ou seja, faça todas as chamadas Rapi nesse processo).
  3. Crie outro aplicativo de usuário (não serviço) e use-o como intercalador entre o Serviço e o RAPI (ou seja, faça todas as chamadas RAPI neste aplicativo).
  4. Execute o código de serviço como de costume (por exemplo, console).
  5. Mude do Rapi para outras interfaces para se comunicar com o dispositivo, por exemplo, TCP.

Eu escolhi o 1º, pessoalmente, já que é o mais adequado no meu caso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top