Listado de puertos serie (COM) en Windows?

Estoy buscando una forma sólida de enumerar los puertos serie (COM) disponibles en una máquina con Windows. Hayesta publicación sobre el uso de WMI, pero me gustaría algo menos específico para .NET: quiero obtener la lista de puertos en un programa Python o C ++, sin .NET.

Actualmente conozco otros dos enfoques:

Leyendo la información en elHARDWARE\\DEVICEMAP\\SERIALCOMM clave de registro. Esto parece una gran opción, pero esrobusto? No puedo encontrar una garantía en línea o en MSDN de que esta celda de registro tenga siempre la lista completa de puertos disponibles.

Intentar llamarCreateFile enCOMN con N un número de 1 a algo. Esto no es lo suficientemente bueno, porque algunos puertos COM no se denominan COMN. Por ejemplo, algunos puertos COM virtuales creados se denominan CSNA0, CSNB0, etc., por lo que no confiaría en este método.

¿Algún otro método / idea / experiencia para compartir?

Editar: por cierto, aquí hay una implementación simple de Python para leer los nombres de puertos del registro:

import _winreg as winreg
import itertools


def enumerate_serial_ports():
    """ Uses the Win32 registry to return a iterator of serial 
        (COM) ports existing on this computer.


    """
    path = 'HARDWARE\\DEVICEMAP\\SERIALCOMM'
    try:
        key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path)
    except WindowsError:
        raise IterationError

    for i in itertools.count():
        try:
            val = winreg.EnumValue(key, i)
            yield (str(val[1]), str(val[0]))
        except EnvironmentError:
            break

Respuestas a la pregunta(8)

Su respuesta a la pregunta