Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi COM-Schnittstelle: Gerätenamen ermitteln (https://www.delphipraxis.net/128285-com-schnittstelle-geraetenamen-ermitteln.html)

Carsten1234 27. Jan 2009 13:27


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

Jens Hartmann 27. Jan 2009 13:37

Re: COM-Schnittstelle: Gerätenamen ermitteln
 
Hallo Carsten,

Schau dir mal die Komponente Async Pro an.

Async Pro 4.07

MFG

Jens

Carsten1234 27. Jan 2009 13:44

Re: COM-Schnittstelle: Gerätenamen ermitteln
 
Hallo Jens,

Zitat:

Zitat von Jens Hartmann
Hallo Carsten,
Schau dir mal die Komponente Async Pro an.

mit der arbeite ich gerade bzw. arbeite mich dort wieder ein. Aber dort gibt es das von mir gesuchte nicht (oder ich bin noch nicht fündig geworden).
Ich dachte mehr so an CreateFile und (evtl.) DeviceIoControl, um an die gesuchten Infos zu kommen...

Gruß, Carsten

Jens Hartmann 27. Jan 2009 13:54

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

Carsten1234 27. Jan 2009 14:02

Re: COM-Schnittstelle: Gerätenamen ermitteln
 
Hallo Jens,

Zitat:

Zitat von Jens Hartmann
Sorry

kein Problem. Ich danke Dir für den Lösungsvorschlag.

Gruß, Carsten

v2afrank 27. Jan 2009 14:15

Re: COM-Schnittstelle: Gerätenamen ermitteln
 
Ich weiss leider nicht mehr wo ich das herhabe aber der Code sollte Dir weiterhelfen.
interface
Delphi-Quellcode:
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;
Dieser Code listet Dir die Comports wie der gerätemanager auf. Virtuelle Ports werden allerdings nicht aufgelistet.

WS1976 27. Jan 2009 14:24

Re: COM-Schnittstelle: Gerätenamen ermitteln
 
Hallo,
mit Asynchpro:

Delphi-Quellcode:
  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));
LB1 ist eine Tstringlist.

Grüsse
Rainer

Carsten1234 28. Jan 2009 06:18

Re: COM-Schnittstelle: Gerätenamen ermitteln
 
Hallo Rainer,

Zitat:

Zitat von WS1976
mit Asynchpro:

Delphi-Quellcode:
  comport.ShowPortsInUse := False; //nur die freien Schnittstellen werden angezeigt. Evtl. auf true setzen.

und von welchem Typ ist 'comport'? TApdComPort?
TApdComPort kennt weder ShowPortsInUse noch IsPortAvailable, letztere ist ("nur") in AdSelCom.pas deklariert.

Gruß, Carsten

Chemiker 28. Jan 2009 07:12

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

WS1976 28. Jan 2009 08:15

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 20:46 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz