AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi COM-Schnittstelle: Gerätenamen ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

COM-Schnittstelle: Gerätenamen ermitteln

Ein Thema von Carsten1234 · begonnen am 27. Jan 2009 · letzter Beitrag vom 25. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#1

COM-Schnittstelle: Gerätenamen ermitteln

  Alt 27. Jan 2009, 13:27
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
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#2

Re: COM-Schnittstelle: Gerätenamen ermitteln

  Alt 27. Jan 2009, 13:37
Hallo Carsten,

Schau dir mal die Komponente Async Pro an.

Async Pro 4.07

MFG

Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#3

Re: COM-Schnittstelle: Gerätenamen ermitteln

  Alt 27. Jan 2009, 13:44
Hallo Jens,

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
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#4

Re: COM-Schnittstelle: Gerätenamen ermitteln

  Alt 27. Jan 2009, 13:54
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#5

Re: COM-Schnittstelle: Gerätenamen ermitteln

  Alt 27. Jan 2009, 14:02
Hallo Jens,

Zitat von Jens Hartmann:
Sorry
kein Problem. Ich danke Dir für den Lösungsvorschlag.

Gruß, Carsten
  Mit Zitat antworten Zitat
v2afrank

Registriert seit: 9. Mai 2005
Ort: Bocholt
571 Beiträge
 
Delphi XE2 Professional
 
#6

Re: COM-Schnittstelle: Gerätenamen ermitteln

  Alt 27. Jan 2009, 14:15
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.
  Mit Zitat antworten Zitat
WS1976
(Gast)

n/a Beiträge
 
#7

Re: COM-Schnittstelle: Gerätenamen ermitteln

  Alt 27. Jan 2009, 14:24
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
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#8

Re: COM-Schnittstelle: Gerätenamen ermitteln

  Alt 28. Jan 2009, 06:18
Hallo Rainer,

Zitat von WS1976:
mit Asynchpro:

  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
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker
Online

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: COM-Schnittstelle: Gerätenamen ermitteln

  Alt 28. Jan 2009, 07:12
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
WS1976
(Gast)

n/a Beiträge
 
#10

Re: COM-Schnittstelle: Gerätenamen ermitteln

  Alt 28. Jan 2009, 08:15
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:37 Uhr.
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