Comport-Anzahl ermitteln



  • Moin ihr!
    Ich suche nach einem WinAPI-Befehl, der mir sagt, wie viele serielle Schnittstellen an meiner Maschiene zur Verfügung stehen.
    Thx für jede Antwort.



  • So z.B.:
    Das gibt dir aber nur die verfügbaren Ports zurück (Also wenn com1 existiert und dieser gerade von einem Programm benützt wird - dann gibt CreateFile false zurück)

    char comport[11] = "\\\\.\\COM";
    	bool port[256] = { false };
    	for(int i = 1;i <= 256;++i)
    	{
    		itoa(i,comport + 7,10);
    
    		HANDLE com = CreateFile(comport,0,0,0,OPEN_EXISTING,0,0);
    		if(com != INVALID_HANDLE_VALUE)
    		{
    			CloseHandle(com);
    			port[i - 1] = true;
    		}
    	}
    


  • Auf die Idee bin ich auch schon gekommen, doch sauber ist sie ja nicht und wie du schon gesagt hast, bekomme ich nicht die Anzahl aller Schnittstellen geliefert. Aber trotzdem danke.



  • char comport[11] = "\\\\.\\COM";
    	bool port[256] = { false };
    	for(int i = 1;i <= 256;++i)
    	{
    		itoa(i,comport + 7,10);
    
    		HANDLE com = CreateFile(comport,0,0,0,OPEN_EXISTING,0,0);
    		if(com != INVALID_HANDLE_VALUE)
    		{
    			CloseHandle(com);
    			port[i - 1] = true;
    		}
            /* Ergaenzung */
            else
            {
                 port[i - 1] = (GetLastError() != ERROR_FILE_NOT_FOUND);
            }
            /* Ergaenzung Ende */
        }
    

    Und für die Anzahl brauchst Du doch nur die trues im Array abzuzählen.



  • Man kann ja auch bei true einfach einen counter hochzählen lassen.
    Aber wirklich sauber ist das nicht. Aber anscheinend scheint es nichts besseres zu geben.
    Ich hoffe trortzdem noch auf meinen Traumprinzen, der mir die WinAPI-Funktion dazu nennt (im MSDN und PSDK steht scheinbar nix).



  • Ich sehe da nichts unsauberes, jedenfalls nicht, wenn man im Falle des Fehlschlags mit GetLastError den Grund abprüft. Klar, das Array kann entfallen, aber das wirst Du wohl gerade noch selber hinbekommen.

    Aber gut, es gibt auch spezielle Funktionen. Das geht aber erst unter neueren Versionen (ab 98, bzw. 2000). Und die sind sehr wohl dokumentiert (MSDN/ PSDK): SetupDiGetClassDevs, SetupDiEnumDeviceInterfaces.

    Schnelles Sample:

    BOOL CountPorts(DWORD* pCnt)
    {
      SP_DEVICE_INTERFACE_DATA  spdid;
      HDEVINFO                  hDevInfo;
    
        if(IsBadWritePtr(pCnt, sizeof(*pCnt)))
        {
            SetLastError(ERROR_INVALID_PARAMETER);
            return(FALSE);
        }
    
        *pCnt = 0;
    
        if(INVALID_HANDLE_VALUE == (hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COMPORT, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT)))
            return(FALSE);
    
        ZeroMemory(&spdid, sizeof(spdid));
        spdid.cbSize = sizeof(spdid);
    
        for( ; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &GUID_DEVINTERFACE_COMPORT, *pCnt, &spdid); ++(*pCnt))
            ;
    
        SetupDiDestroyDeviceInfoList(hDevInfo);
    
      return(TRUE);
    }
    

    Der Aufruf funktioniert so:

    TCHAR sz[88];
    DWORD dwNumPorts;
    
    if(CountPorts(&dwNumPorts))
    {
        wsprintf(sz, TEXT("Ports gefunden: %u"), dwNumPorts);
    }
    else
    {
        wsprintf(sz, TEXT("Fehler passiert.\nErrorCode %u"), GetLastError());
    }
    
    MessageBox(NULL, sz, NULL, MB_OK);
    

    GUID_DEVINTERFACE_COMPORT findet Ihr übrigens in <winioctl.h>



  • Also ich finde es schon unsauber, dass man überhaupt die einzelnen Ports nacheinander auf ihre Existenz prüfen muss. Ich hatte jetzt gehofft, dass es eine Funktion wie GetComPortCount() gibt (schließlich gibt es auch sowas für Monitore).
    Welche der beiden Varianten ist denn schneller?

    Und die sind sehr wohl dokumentiert

    Unter welchem Kapitel hast du die Funktionen gefunden? Ich hab mich bei Hardware und ComPort dumm und dusselig gelesen.



  • DennisB schrieb:

    Ich hatte jetzt gehofft, dass es eine Funktion wie GetComPortCount() gibt (schließlich gibt es auch sowas für Monitore).

    Hast Du ja jetzt.

    Welche der beiden Varianten ist denn schneller?

    Keine Ahnung. Ich weiß nicht, wie lange es dauert, die Monitore abzuzählen.

    Unter welchem Kapitel hast du die Funktionen gefunden? Ich hab mich bei Hardware und ComPort dumm und dusselig gelesen.

    Device Management Functions
    Device Installation Functions



  • Äh wie wärs mit EnumPorts()?

    -junix



  • junix schrieb:

    Äh wie wärs mit EnumPorts()?

    Ja? Das macht doch eigentlich was anderes: "The EnumPorts function enumerates the ports that are available for printing on a specified server."



  • _DennisB_ schrieb:
    Ich hatte jetzt gehofft, dass es eine Funktion wie GetComPortCount() gibt (schließlich gibt es auch sowas für Monitore).

    Hast Du ja jetzt.

    Zitat:
    Welche der beiden Varianten ist denn schneller?

    Keine Ahnung. Ich weiß nicht, wie lange es dauert, die Monitore abzuzählen.

    Scherzkeks!

    Naja. Ich bedanke mich soweit bei -King- und Nemesyzz und sage: der Thread kann geschlossen werden.


Anmelden zum Antworten