Ich versuche mich gerade an Windows-Apps in C/C++ (Code::Blocks IDE und MinGW Compiler). Dort möchte ich beim Aufruf eines Menüpunktes eine Liste der zu diesem Zeitpunkt im OS verfügbaren Serial-Ports ermitteln aus denen ich dann Untermenüs zur Auswahl dynamisch erstellen kann.
Die komme ich am besten an eine solche Liste? Die Geräte mit denen ich aktuell teste haben alle ein "COM..." im Portbezeichner, auch wenn es sich dabei teilweise um virtuelle COM-Ports (USB) handelt.
Mein erster (brute-force) Versuch über eine Loop von 1-255 mit der API-Funktion GetDefaultCommConfig() hat zwar teilweise funktioniert, dauert aber sehr lange (ca. 1 Minute).
Ich lese dafür die Einträge aus der Registry ein:
"HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM"
Klingt spannend. Alle Beispiele die ich so gefunden habe nutzen die OpenFile funktionen. Kannst Du einen Beispielcode geben wie man über die Registry iteriert?
Ich denke ich muss zuerst den Schlüssel öffnen. Dazu gibt es in der Win32 API im "Winreg.h" schon ein halbes Dutzend Funktionen. Ich könnte mir diese vorstellen:
1
LSTATUS RegOpenKeyExA(
2
[in] HKEY hKey,
3
[in, optional] LPCSTR lpSubKey,
4
[in] DWORD ulOptions,
5
[in] REGSAM samDesired,
6
[out] PHKEY phkResult
7
);
1
HKEY hk;
2
long h;
3
h = RegOpenKeyExA(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hk);
bei der while-Schleife setzt du die Werte nicht erneut. lpvalueSize ist zuerst 50, wird dann mit der Länge des ersten Ports 'COM5' ersetzt, also 4. Beim zweiten Aufruf übergibst du die 4, und solltest einen Fehler empfangen, da der Buffer jetzt zu klein ist für den zweiten Port 'COM12', der benötigt für 5 Zeichen Platz.
Ist aber nur eine Vermutung. Du solltest den Rückgabewert prüfen.
Dort möchte ich beim Aufruf eines Menüpunktes eine
Liste der zu diesem Zeitpunkt im OS verfügbaren Serial-Ports ermitteln
aus denen ich dann Untermenüs zur Auswahl dynamisch erstellen kann.
Die komme ich am besten an eine solche Liste? Die Geräte mit denen ich
aktuell teste haben alle ein "COM..." im Portbezeichner, auch wenn es
sich dabei teilweise um virtuelle COM-Ports (USB) handelt.
ich hatte das mal mit LCC32 gemacht um mein Antennenmessgerät zu finden und die falschen COM: zu ignorieren.
Die Suche in der Registry ist kein wirklich empfohlender Ansatz, weil sich das von WIndows-Version zu Windows-Version ändern kann. Normalerweise geht man über die setupapi.dll.
winbase.h brauchst du nicht explizit, das wird schon von windows.h inkludiert. Hilft dir jetzt natürlich auch nicht weiter.
Unter Windows habe ich für C++ nur Visual Studio installiert, damit klappt der Aufruf von GetCommPorts so wie beschrieben einwandfrei.
Du müsstest nachforschen, warum der Compiler die Deklaration nicht sieht. Wobei ... verwendet MinGW nicht eigene Windows-Header, also nicht die aus dem Windows-SDK? Vielleicht ist GetCommPorts da einach (noch?) nicht drin? Am besten mal nachsehen (nach "GetCommPorts" suchen).