![]() |
COM-Schnittstelle: Gerätenamen ermitteln
Hallo,
wie kann man von einem seriell angeschlossenen Gerät den Gerätenamen ermitteln (ohne ggf. vorher alle COM-Ports nacheinander zu öffnen)? Ich stelle mir eine Auflistung ähnl. der im Gerätemanager => Anschlüsse (COM und LPT) vor. Kann man evtl. den Gerätemanager selbst diesbzgl. auslesen? Danke vorab und Gruß, Carsten |
Re: COM-Schnittstelle: Gerätenamen ermitteln
|
Re: COM-Schnittstelle: Gerätenamen ermitteln
Hallo Jens,
Zitat:
Ich dachte mehr so an CreateFile und (evtl.) DeviceIoControl, um an die gesuchten Infos zu kommen... Gruß, Carsten |
Re: COM-Schnittstelle: Gerätenamen ermitteln
Hallo Carsten,
Soweit habe ich mich mit dieser Komponente auch noch nicht beschäftigt, sollte Dir nur eventuell eine Hilfe sein, dein Problem zu lösen. Sorry MFG Jens |
Re: COM-Schnittstelle: Gerätenamen ermitteln
Hallo Jens,
Zitat:
Gruß, Carsten |
Re: COM-Schnittstelle: Gerätenamen ermitteln
Ich weiss leider nicht mehr wo ich das herhabe aber der Code sollte Dir weiterhelfen.
interface
Delphi-Quellcode:
Dieser Code listet Dir die Comports wie der gerätemanager auf. Virtuelle Ports werden allerdings nicht aufgelistet.
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, JwaWinType, SetupApi, Cfg, CfgMgr32, StdCtrls; procedure FindComports(var Astringlist:TStringlist); implementation // Delphi wrapper for CM_Get_Device_ID function GetDeviceID(Inst: DEVINST): string; var Buffer: PTSTR; Size: ULONG; begin CM_Get_Device_ID_Size(Size, Inst, 0); // Required! See DDK help for CM_Get_Device_ID Inc(Size); Buffer := AllocMem(Size * SizeOf(TCHAR)); CM_Get_Device_ID(Inst, Buffer, Size, 0); Result := Buffer; FreeMem(Buffer); end; // Delphi wrapper for SetupDiGetDeviceRegistryProperty function GetRegistryPropertyString(PnPHandle: HDEVINFO; const DevData: TSPDevInfoData; Prop: DWORD): string; var BytesReturned: DWORD; RegDataType: DWORD; Buffer: array [0..1023] of TCHAR; begin BytesReturned := 0; RegDataType := 0; Buffer[0] := #0; SetupDiGetDeviceRegistryProperty(PnPHandle, DevData, Prop, RegDataType, PByte(@Buffer[0]), SizeOf(Buffer), BytesReturned); Result := Buffer; end; function ExtractBus(DeviceID: string): string; begin Result := Copy(DeviceID, 1, Pos('\', DeviceID) - 1); end; procedure FindComports(var Astringlist:TStringlist); const GUID_DEVINTERFACE_COMPORT: TGUID = '{86e0d1e0-8089-11d0-9ce4-08003e301f73}'; GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR: TGUID = '{4D36E978-E325-11CE-BFC1-08002BE10318}'; var PnPHandle: HDEVINFO; DevData: TSPDevInfoData; DeviceInterfaceData: TSPDeviceInterfaceData; FunctionClassDeviceData: PSPDeviceInterfaceDetailData; Success: LongBool; Devn: Integer; BytesReturned: DWORD; SerialGUID: TGUID; Inst: DEVINST; RegKey: HKEY; RegBuffer: array [0..1023] of Char; RegSize, RegType: DWORD; FriendlyName: string; PortName: string; DeviceDescription: string; Bus: string; TestHandle : integer; i:integer; begin // these API conversions are loaded dynamically by default LoadSetupApi; LoadConfigManagerApi; // enumerate all serial devices (COM port devices) SerialGUID := GUID_DEVINTERFACE_COMPORT; // GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR; PnPHandle := SetupDiGetClassDevs(@SerialGUID, nil, 0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE); if PnPHandle = Pointer(INVALID_HANDLE_VALUE) then Exit; Devn := 0; repeat DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData); Success := SetupDiEnumDeviceInterfaces(PnPHandle, nil, SerialGUID, Devn, DeviceInterfaceData); if Success then begin DevData.cbSize := SizeOf(DevData); BytesReturned := 0; // get size required for call SetupDiGetDeviceInterfaceDetail(PnPHandle, @DeviceInterfaceData, nil, 0, BytesReturned, @DevData); if (BytesReturned <> 0) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin // allocate buffer and initialize it for call FunctionClassDeviceData := AllocMem(BytesReturned); FunctionClassDeviceData.cbSize := SizeOf(TSPDeviceInterfaceDetailData); if SetupDiGetDeviceInterfaceDetail(PnPHandle, @DeviceInterfaceData, FunctionClassDeviceData, BytesReturned, BytesReturned, @DevData) then begin // gives the friendly name of the device as shown in Device Manager FriendlyName := GetRegistryPropertyString(PnPHandle, DevData, SPDRP_FRIENDLYNAME); // gives a device description DeviceDescription := GetRegistryPropertyString(PnPHandle, DevData, SPDRP_DEVICEDESC); // now try to get the assigned COM port name RegKey := SetupDiOpenDevRegKey(PnPHandle, DevData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); RegType := REG_SZ; RegSize := SizeOf(RegBuffer); RegQueryValueEx(RegKey, 'PortName', nil, @RegType, @RegBuffer[0], @RegSize); RegCloseKey(RegKey); PortName := RegBuffer; Inst := DevData.DevInst; CM_Get_Parent(Inst, Inst, 0); Bus := ExtractBus(GetDeviceID(Inst)); Astringlist.Add(PortName + ' (' + DeviceDescription + ', ' + Bus+')'); end; FreeMem(FunctionClassDeviceData); end; end; Inc(Devn); until not Success; SetupDiDestroyDeviceInfoList(PnPHandle); // unload API conversions UnloadSetupApi; UnloadConfigManagerApi; end; |
Re: COM-Schnittstelle: Gerätenamen ermitteln
Hallo,
mit Asynchpro:
Delphi-Quellcode:
LB1 ist eine Tstringlist.
comport.ShowPortsInUse := False; //nur die freien Schnittstellen werden angezeigt. Evtl. auf true setzen.
LB1.Clear; for I := 1 to 100 do If comport.IsPortAvailable(I) then LB1.Items.Add(comport.ComName(I)); Grüsse Rainer |
Re: COM-Schnittstelle: Gerätenamen ermitteln
Hallo Rainer,
Zitat:
TApdComPort kennt weder ShowPortsInUse noch IsPortAvailable, letztere ist ("nur") in AdSelCom.pas deklariert. Gruß, Carsten |
Re: COM-Schnittstelle: Gerätenamen ermitteln
Hallo Carsten1234,
Ist nur eine Funktion die in AdSelCom deklariert ist. Ich vermute das WS1976 das Ganze in eine Klasse deklariert hat die comport heißt. Bis bald Chemiker |
Re: COM-Schnittstelle: Gerätenamen ermitteln
Hallo,
ich hab mich leider etwas vertan.Die Schnittstelle ist vom Typ TApdComPort aber comport ist keine Klasse von mir sondern nur so "hingeschrieben" weil ich mir eingebildet hatte, dass sowohl Isportavailable als auch ShowPortsInUse zu ADPcomport gehören. Dem ist nicht so. Die Funktion Isportavailable ist in adselcom deklariert und ist natürlich keine Methode von Tadpcomport. Das gleiche gilt für ShowPortsInUse ( Konstante in adselcom ). Einfach adselcom in Uses fertig. Nochmal sorry war geistig woanders als ich das geschrieben habe. Grüsse rainer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz