2010-02-18 18 views
1

Pour accéder aux périphériques Windows CE à partir de mon application de bureau, j'ai utilisé une DLL auto-écrite. Cette DLL utilisait RAPI pour appeler les fonctions nécessaires côté périphérique. Tout a fonctionné correctement pendant des années. Mais maintenant je voulais utiliser cette DLL dans le service Windows. Et ça a échoué. Le débogage montre que c'est la fonction CeRapiInitEx() qui échoue. Et avant d'échouer, il bloque pendant environ 5 secondes, bien que MSDN indique qu'il s'agit d'une fonction asynchrone non bloquante. GetLastError() me donne 1444L "identifiant de thread invalide". Quelqu'un sur Internet a mentionné que RAPI ne fonctionnait pas à partir des threads de service dans ActiveSync 4. Bien que l'information soit mauvaise et scrap.Utilisation de RAPI dans le service Windows

Quelqu'un a-t-il le même problème ou a-t-il quelque chose à dire? Est-il vrai que RAPI n'est pas accessible depuis le service Windows? Si oui, existe-t-il des solutions de contournement?

Répondre

1

solutions possibles pour ce problème:

  1. Downgrade ActiveSync à la version 3.8 et donner l'autorisation de service pour interagir avec le bureau (système d'utilisation des services applet pour cela).
  2. Générer un autre processus utilisateur (CreateProcessAsUser) et l'utiliser comme intercouche entre le service et RAPI (c'est-à-dire effectuer tous les appels RAPI dans ce processus).
  3. Créez une autre application utilisateur (non-service) et utilisez-la comme intercouche entre le service et RAPI (c'est-à-dire, effectuez tous les appels RAPI dans cette application).
  4. Exécutez le code de service comme d'habitude (par exemple console).
  5. Passer de RAPI à d'autres interfaces pour communiquer avec le dispositif, par ex. TCP.

J'ai choisi 1er, personnellement, car c'est le plus approprié dans mon cas.