Usando Rapi no serviço Windows
-
21-09-2019 - |
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?
Solução
Possíveis soluções para este problema:
- 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).
- 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).
- 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).
- Execute o código de serviço como de costume (por exemplo, console).
- 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.