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"
Darunter findest du alle aktuell vorhandenen Ports.
Peter
Versuchs mal mit den Std. Win32-Funktionen
- FindFirstFile
- FindNextFile,
Wildcards werden akzeptiert.
Bei COMs müsste evtl. noch der Anfang des Filenamemusters
entsprechend angepasst werden.
Peter D. schrieb:> 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);
Hallo Olli,
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.
Peter
Olli Z. schrieb:> 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.
https://lcc-win32.services.net/
Olli Z. schrieb:> Da meckert Codeblocks das es die Funktion nicht kennt (not declared).> <winbase.h> ist drin.
Versuche mal
#include <windows.h>
Und OneCore.lib linken.
Knecht Ruprecht schrieb:> Olli Z. schrieb:>> Da meckert Codeblocks das es die Funktion nicht kennt (not declared).>> <winbase.h> ist drin.>> Versuche mal>> #include <windows.h>>> Und OneCore.lib linken.
Ja, hatte ich gemacht, klappt trotzdem nicht:
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).
Peter D. schrieb:> bei der while-Schleife setzt du die Werte nicht erneut. lpvalueSize ist
Hallo Peter, danke für den Tipp aber auch wenn ich alle Variablen neu
initialisiere bekomme ich immer nur 2 von 3:
1
Number of device found: 3
2
Number of devices found: 3
3
#0: COM5 (len 5) \Device\Serial0 (len 15)
4
#1: COM8 (len 5) \Device\VCP0 (len 12)
Wenn ich nun den mit COM12 belegten Port auf COM2 ändere bekomme ich
alle drei:
1
Number of devices found: 3
2
#0: COM5 (len 5) \Device\Serial0 (len 15)
3
#1: COM8 (len 5) \Device\VCP0 (len 12)
4
#2: COM2 (len 5) \Device\Silabser0 (len 17)
Du hast also absolut recht Peter, wenn ich den "rc" mal auswerte: