En utilisant RAPI dans Windows
-
21-09-2019 - |
Question
Pour accéder aux périphériques Windows CE de mon application de bureau je DLL auto-écrit. Cette DLL utilisée RAPI pour appeler les fonctions nécessaires sur le côté de l'appareil. Tout a travaillé très bien depuis des années.
Mais maintenant, je voulais utiliser cette DLL dans Windows. Et il a échoué. Debug montre qu'il est fonction CeRapiInitEx () qui échoue. Et avant d'échouer il bloque pendant environ 5 secondes, bien que MSDN dit est une fonction asynchrone non-bloquant. GetLastError () me donne 1444L "identifiant de thread non valide".
Quelqu'un sur Internet a mentionné que RAPI n'a pas de fils de service dans ActiveSync 4. Bien que l'information est pauvre et décousu.
Quelqu'un at-il le même problème ou tout simplement quelque chose à dire? Est-il vrai que RAPI est pas accessible depuis le service Windows? Si oui, y at-il des solutions de contournement?
La solution
Les solutions possibles pour ce problème:
- Downgrade ActiveSync à la version 3.8 et de donner l'autorisation d'interagir avec un service bureau (système d'utilisation des services applet pour cela).
- Spawn un autre processus utilisateur ( CreateProcessAsUser ) et l'utiliser comme intermédiaire entre le service et RAPI (c.-à-faire tous les appels RAPI dans ce processus).
- Créer un autre utilisateur de l'application (non-service), et l'utiliser comme intermédiaire entre le service et RAPI (à savoir, faire tous les appels RAPI dans cette application).
- Run code de service que l'application habituelle (par exemple, la console).
- Commutateur de RAPI à une autre interface pour communiquer avec un dispositif, par exemple, TCP.
J'ai choisi 1er, personnellement, car il est le plus approprié dans mon cas.