Hardwareinfos auslesen
-
Auszug aus meiner Siemens Mobile Engine:
void __fastcall TCommSettings::GetCommPorts(TStrings *strCommPorts) { // Alle verfügbaren COM Ports aus der Registry auslesen // und als TStrings zurückgeben TStringList *MyStringList = new TStringList; TRegistry *MyReg = new TRegistry; MyReg->RootKey = HKEY_LOCAL_MACHINE; MyReg->OpenKey("\\HARDWARE\\DEVICEMAP\\SERIALCOMM", false); MyReg->GetValueNames(MyStringList); for (int i=0; i<MyStringList->Count; i++) { MyStringList->Strings[i] = MyReg->ReadString(MyStringList->Strings[i]) + ": " + MyStringList->Strings[i].SubString(9,MyStringList->Strings[i].Length()) + ""; } MyStringList->Sort(); for (int i=0; i<MyStringList->Count; i++) { strCommPorts->Add(MyStringList->Strings[i]); } if (strCommPorts->Count == 0) { // Autodetection failed for (int i = 1; i<129; i++) { strCommPorts->Add("COM"+IntToStr(i)); } } MyReg->CloseKey(); delete MyReg; delete MyStringList; }
-
ich hoffe deine engine wird keiner verwenden, so ineffektiv wie die ist.

-
Das hier ist nur eine Routine um die COM Ports aufzulisten und in eine Combo Box
zu schreiben. Das wird ganz genau ein mal pro Programmstart gemacht und benötigt
keinerlei für den den User erkennbare Zeit zum ausführen.Du kannst aber gerne was besseres programmieren. Oder konstruktive Vorschläge
machen.Eingesetzt wird die Engine in:
BFCTester, Direct Softkey Editor, Display Inverter, Highspeed PortMonitor,
NonameCable Activator, Open65, ObexFlexmem Browser, Repair65, Repair75,
S45i Activator, Siemens ARM Debugger, Siemens C166 Debugger,
Siemens Contrast Tool, Siemens EEPROM Toolz, Siemens Picture Changeund einigen mehr Programmen. Ich sehe kein Problem bei der Routine, da
es hier nun wirklich nicht auf Geschwindigkeit ankommt.
-
kein wunder wenn der deutsche wirtschaftsstandort baden geht... wenn unternehmen sich mit sowas zufrieden geben.
Acidmrp schrieb:
Das hier ist nur eine Routine um die COM Ports aufzulisten und in eine Combo Box zu schreiben. Das wird ganz genau ein mal pro Programmstart gemacht und benötigt keinerlei für den den User erkennbare Zeit zum ausführen.
wenn du dein gesamtes programm zu aufbaust, dann prost mahlzeit!
ist *TStrings strCommPorts überhaupt gültig?
wo ist die überprüfung ob MyStringList und MyReg ueberhaupt existieren?[cpp]
// insgesamt 4 mal greifst du auf MyStringList->Strings[i] zu!
for (int i=0; i<MyStringList->Count; i++)
{
MyStringList->Strings[i] = MyReg->ReadString(MyStringList->Strings[i])
+ ": "
+ MyStringList->Strings[i].SubString(9, MyStringList->Strings[i].Length())
+ ""; // was ist das?
}
[/cpp]OpenKey() gibt etwas zurück das ausgewertet werden sollte!
// schonmal was von AddStrings gehört? for (int i=0; i<MyStringList->Count; i++) { strCommPorts->Add(MyStringList->Strings[i]); }// naja, welche maschine hat denn 128 Com-Ports??? for (int i = 1; i<129; i++) { strCommPorts->Add("COM"+IntToStr(i));schau dir mal CreateFile an! damit kannste dann versuchen die ports zu öffnen und nur die anzeigen, die auch wirklich da sind!
-
wenn du dein gesamtes programm zu aufbaust, dann prost mahlzeit!
hast du mein ganzes Programm gesehen? Wie schon gesagt das ist nur eine kleine,
unwichtige Routine. Von den etlichen 1000 Benutzern hatte noch _keiner_ ein
Problem damit.ist TStrings *strCommPorts überhaupt gültig?
warum sollte das ungültig sein? Es funktioniert wunderbar. Wie gesagt, es geht hier
um die Elemente einer ComboBox.OpenKey() gibt etwas zurück das ausgewertet werden sollte!
das sollte ich machen, in diesem Punkt hast du recht.
schonmal was von AddStrings gehört?
AddStrings ist mir neu. Danke.
schau dir mal CreateFile an! damit kannste dann versuchen die ports zu öffnen und nur die anzeigen, die auch wirklich da sind
eine wirklich tolle Idee. Alle Ports die schon von einem anderen Programm
verwendet werden werden einfach nicht angezeigt. Zudem will ich gerne
Beschreibungen für die COM Ports haben. Das ist eine ganz nette Sache.
Und nochwas, wo hör ich auf die Ports durchzutesten? Klar, echte COM Ports
wird es sicher nicht mehr wie 4 geben, aber ein Handy ist i.d.R. an einem
USB Datenkabel angeschlossen, welches auch mal am virtuellen COM Port
67 hängen könnte.Der Source sollte ja auch nur als Hilfestellung dienen komplett kann er ihn
eh nicht übernehmen, da die Entsprechende Schnittstelle fehlt.
-
Acidmrp schrieb:
Wie schon gesagt das ist nur eine kleine,
unwichtige Routine.es gibt keine unwichtigen routinen!
Acidmrp schrieb:
warum sollte das ungültig sein?
wegen ist nicht und bodennebel! da kann es viele gründe geben. und zu einer sauberen programmierung gehört das einfach dazu!

hier so könnte ich mir die routine vorstellen:
void __fastcall TCommSettings::GetCommPorts(TStrings *strCommPorts) { if (!strCommPorts) return; // Alle verfügbaren COM Ports aus der Registry auslesen // und als TStrings zurückgeben TStringList *MyStringList; TRegistry *MyReg; // noch genügend Speicher da? if (!(MyStringList = new TStringList)) return; // dito if (!(MyReg = new TRegistry)) { delete MyStringList; return; } MyReg->RootKey = HKEY_LOCAL_MACHINE; // klappt Registry öffnen? if (MyReg->OpenKey("\\HARDWARE\\DEVICEMAP\\SERIALCOMM", false)) { MyReg->GetValueNames(MyStringList); int CommCnt = MyStringList->Count; if (!CommCnt) { // Autodetection failed for (int i = 1; i <= 128; ++i) strCommPorts->Add("COM" + IntToStr(i)); } else { AnsiString CommStr; for (int i = 0; i < CommCnt; ++i) { CommStr = MyStringList->Strings[i]; strCommPorts->Add(MyReg->ReadString(CommStr) + ": " + CommStr.SubString(9, CommStr.Length())); } // höchstwahrscheinlich unnötig, da die ehh sortiert sein dürften strCommPorts->Sort(); } MyReg->CloseKey(); } delete MyReg; delete MyStringList; }abgesehen davon, würde ich die funktionialität in ner eigenen klasse kapseln und nicht in nem vcl-formular (__fastcall gelumpse). MyStringList könnte man sicher ganz weglassen wenn man es ein bissel umschreibt.
-
ist es in deinem Sinn, dass wenn die Registry nicht geöffnet werden kann, es
keine Alternative zur Auswahö der COM Ports gibt? In meiner Variante, wird die
ComboBox, die es geben _muss_ dann eben mit den Ports 1 bis 128 gefüllt.Na ja, wenn ich jede nebensächliche Routine bis ins Detail optimieren würde,
wär ich vermutlich noch immer mit dem ersten dieser _Freeware_ Programmen
beschäftigt. Mir ist hauptsächlich wichtig, dass die Routinen zum senden /
empfangen, die zu 99% der Programmlaufzeit ausmachen, bis ins Detail optimiert
sind.
-
Hallo,
Das hier
if (!(MyStringList = new TStringList)) return;ist Quatsch, da new im Fehlerfall keinen Nullpointer zurückliefert sondern eine bad_alloc Exception wirft. Du mußt hier also try/catch verwenden.
Dann sollte man die Erzeugung der StringList in den Abschnitt nach OpenKey verlegen. Wenn das Öffnen des Keys nicht klappt, braucht man sie ja nicht.Ciao
-
ist richtig, hab bei mir den new_handler überschrieben, so dass er 0 liefert wenn kein speicher frei ist.
-
Hallo,
danke für all die Infos.
Werde mal sehen was ich mir draus basteln kann.
Es sollen eigentlich nur die hardwaremäßig wirklich vorhandenen seriellen Schnittstellen angezeigt bzw. im Konfig-Menü geenabled werden.Nochmal Dank an Alle.