2008-10-08 9 views
3

Je maintiens une application qui utilise la fonction win32 EnumPorts() pour aider à déterminer l'ensemble des ports série installés sur l'ordinateur. J'ai vu des cas sur certains ordinateurs où l'appel pour obtenir cette information échoue avec un code GetLastError() de 1722 (le serveur RPC n'est pas disponible). Je suppose que cela a quelque chose à voir avec les paramètres du registre ou un service requis désactivé, mais ma recherche a été jusqu'ici plutôt infructueuse. Est-ce que quelqu'un d'autre a rencontré ce problème?EnumPorts() renvoie une erreur étrange sur certaines machines

En réponse aux commentaires d'Euro Micelli. J'essaie spécifiquement de remplir une liste de sélection qui permettra à l'utilisateur de choisir une liste de sélection disponible. Pour commencer, je me suis basé exclusivement sur EnumPorts() pour me fournir une liste de noms de port série potentiels. Il s'est avéré peu sûr, cependant dans plusieurs sens: Il n'a pas toujours fourni l'ensemble complet des noms de port et, comme je l'ai vu récemment, il peut ne pas fonctionner complètement quand le "service de RPC est indisponible". Pourquoi RPC est nécessaire pour savoir quels ports sont disponibles sur la machine locale est complètement au-delà de moi, mais il est là. Ce dernier problème était la goutte d'eau finale. Pour autant que je me fie entièrement à la liste des noms fournis, je filtre ces noms à l'aide de la fonction GetDefaultCommConfig() pour déterminer la nature exacte de chacun des noms que j'ai trouvés. Dans mon expérience, la liste de noms fournie par la clé de registre mentionnée précédemment a été la méthode la plus fiable pour obtenir les noms de port. En fait, je peux voir la clé mise à jour que je désactive les pilotes de port dans le gestionnaire de périphériques de l'appareil. Dans les expériences normales, je suis d'accord avec l'évaluation selon laquelle s'appuyer sur une clé particulière est lourde de périls. Dans ce cas, cependant, M $ n'a jamais fourni un mécanisme décent pour évaluer les noms des ports disponibles.

Je dois préciser que j'ai déjà remplacé l'appel à EnumPorts() par un algorithme qui analyse la clé de registre: HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ SERIALCOMM pour les noms de port série. Cela devrait résoudre le problème une fois que mon logiciel est publié. Ce que je suis après, c'est des pointeurs qui peuvent être donnés aux clients qui utilisent le paquet libéré à l'heure actuelle.

Répondre

0

Il ya beaucoup de ports série bizarres ces jours-ci: câbles série USB, Bluetooth, modems de téléphone portable avec GPS, ... Il pourrait être quelque chose branché sur l'ordinateur et depuis longtemps oublié depuis.

Pour savoir quel port est la cause du problème, vous pouvez essayer d'accéder au gestionnaire de périphériques, sélectionnez "Afficher les périphériques cachés" dans l'onglet "Affichage" et supprimez-les jusqu'à ce que le problème disparaisse. Cela pourrait vous permettre de vous concentrer sur le problème.

+0

J'ai essayé cela en vain. Le problème semble être que EnumPorts() n'est pas capable de se connecter à la machine locale (je suppose que c'est la raison pour laquelle le serveur RPC est pertinent) –

0

Je sais que ce n'est pas une réponse directe à votre question, mais avez-vous envisagé d'utiliser une méthode différente pour énumérer les ports série? Dans mes applications, j'utilise l'API Setup, en utilisant le code du site Web de P J Naughter: http://www.naughter.com/enumser.html, et je trouve que cela fonctionne bien.

1

Je ne suis pas un expert sur EnumPorts, mais je conseille fortement de ne pas compter sur les clés de registre.

  • Les définitions de clés pourraient changer dans le futur.
  • Les définitions de clé peuvent ne pas être ce que vous pensez.
  • Il peut y avoir des façons de «faire un port série» qui n'incluent pas ces clés.
  • Les clés ne reflètent pas la mise à jour le statut, etc., etc.

Vous devez toujours compter sur les API disponibles.

Si une API ne se comporte pas pour vous, essayons de comprendre pourquoi.Peut-être avec un peu d'informations supplémentaires, nous pouvons vous aider à mieux:

Qu'est-ce que c'est exactement que vous devez faire avec le port série?

0

Je sais que cette question est extrêmement ancienne, mais je suis tombé dessus aujourd'hui et j'ai remarqué que personne ne m'avait donné d'explication. La raison de RPC est que vous appelez une fonction de spouleur - vous demandez au spouleur d'impression de renvoyer une liste de ports d'imprimante, qui inclut les ports COM dans la plupart des cas. Je crois que cela peut expliquer vos résultats légèrement peu fiables. RPC est utilisé pour transmettre la requête de votre processus au processus de spouleur actif et le message RPC Server is unavailable se produit lorsque le service de spouleur n'est pas en cours d'exécution (ou ne répond pas correctement).

Questions connexes