Serielle Schnittstelle enumeration in Delphi mit SetupDiGetClassDevs
Ich versuche auflisten "friendly names" für die COM-ports. Die ports können dynamisch zu ändern, wie USB-serial-Geräte angeschlossen sind und getrennt zur Laufzeit.
Basierend auf den möglichen Methoden, beschrieben in diese Frage, ich bin versucht, SetupDiGetClassDevs Methode.
Fand ich dieser Beispiel-code, aber es ist ja für eine ältere version der setupapi-unit (der original-link zu homepages.borland.com nicht funktioniert natürlich).
Ich habe versucht mit der setupapi-Gerät aus der aktuellen JVCL(JVCL340CompleteJCL221-Build3845), aber es scheint nicht kompatibel zu sein mit Delphi 7. Bekomme ich compiler Fehler:
if SetupDiGetDeviceRegistryProperty(DevInfoHandle,DeviceInfoData,
RegProperty,
@PropertyRegDataType,
@S1[1],RequiredSize,@RequiredSize) then begin
In den Aufruf der Funktion SetupDiGetDeviceRegistryProperty,
Ich bekomme die Fehlermeldung "Typen der tatsächlichen und formalen Parameter müssen identisch sein" auf die Parameter @PropertyRegDataType, und @RequiredSize.
Den Delphi3000 Seite sagt der code wurde geschrieben in den Jahren 2004 und ist bestimmt für Delphi 7, also ich bin mir nicht sicher, warum es nicht funktioniert mit Delphi 7, es sei denn, setupapi geändert hat. Ist jemand mit den änderungen vertraut zu setupapi, könnten diese Probleme verursachen?
Teste ich mit einem einfachen Konsolenprogramm. Die uses-Anweisung ist " windows,
sysutils,
Klassen,
setupAPI,
Registrierung;"
Wird das Hauptprogramm:
begin
ComPortStringList := SetupEnumAvailableComPorts;
for Index := 0 to ComPortStringList.Count - 1 do
writeln(ComPortStringList[Index]);
end;
end.
InformationsquelleAutor tim11g | 2011-02-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht aus wie einige Argumente, die von Typ
PDWord
wurden ersetzt durchvar DWord
imSetupApi.pas
. Alles, was Sie brauchen, ist zu entfernen, ' @ ' aus diese Argumente in Ihrem code wie:InformationsquelleAutor kludg
Folgende Prozedur richtig funktioniert bei mir (Windows 8.1). Es ist wichtig, um die parameter
KEY_READ
imTRegistry.Constructor
.Dieses Verfahren sollte ordnungsgemäß in Windows 10 auch, aber ich habe nicht überprüft, es noch.
Funktioniert auch in Windows 7
InformationsquelleAutor Grzegorz Skoczylas
War ich in der Lage, Holen Sie sich einige weitere konkrete Vorschläge von die Frage, einen anderen Weg mit verschiedenen tags.
Es stellt sich heraus, es waren Fehler in der delphi3000.com Beispiel-code, und möglicherweise Fehler in der JVCL-code. Nach dem fixieren der Beispiel-code Fehler, ich habe es zu arbeiten. Habe ich nicht angesprochen, das Potenzial JVCL Fehler.
Hier ist der funktionierende code (wie eine einfache Konsolen-app) für das aufzählen der Namen von com-ports:
InformationsquelleAutor tim11g
Haben Sie "typisierter @ - operator" eingeschaltet? Projekt-Optionen-Compiler unter der Registerkarte "Syntax-Optionen". Eine Menge von third-party-code bricht, wenn die option aktiviert ist.
InformationsquelleAutor
Um den Vorgang zu erleichtern könnten Sie in Erwägung ziehen, einfach mit der registry, wo die Namen aufgelistet sind zB:
(Ich habe Sie weggelassen, die hand-waving-Zeug).
Sie sollten auch mit WMI - siehe dieses Beispiel von Magenta-Systeme - Sie können einem so ziemlich alles hardware-nahe jetzt.
InformationsquelleAutor Brian Frost