Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WM_DEVICECHANGE, DBT_DEVTYP_PORT: Portnamen rausbekommen. (https://www.delphipraxis.net/118039-wm_devicechange-dbt_devtyp_port-portnamen-rausbekommen.html)

Brainshock 30. Jul 2008 13:56


WM_DEVICECHANGE, DBT_DEVTYP_PORT: Portnamen rausbekommen.
 
Hallo,

ich versuche gerade über die WM_DEVICECHANGE Message herauszubekommen, ob ein neuer Com Port von einem USB Barcodescanner im System angelegt/gelöscht wird. Das funktioniert soweit ganz gut. Nun möchte ich noch den Namen des Ports wissen und da scheitert es an meinen API Kenntnissen.

Die Struktur zum Auslesen der Information hab ich schon in Jedi gefunden (DBT.pas):

Delphi-Quellcode:
 
PDevBroadCastPortA = ^TDevBroadCastPortA;
DEV_BROADCAST_PORT_A = record
  dbcp_size: DWORD;
  dbcp_devicetype: DWORD;
  dbcp_reserved: DWORD;
  dbcp_name: array [0..0] of AnsiChar;
end;
TDevBroadCastPortA = DEV_BROADCAST_PORT_A;
Das Auslesen mache ich über:

Delphi-Quellcode:
PDevBroadcastPortA(Msg.LParam)^.dbcp_name
Ich weiß nicht, wie ich mit dem dhcp_name umgehen soll, laut msdn ist es ein Pointer zu einem nullterminierten string. Die Länge im Ergebnis ist 1 und enthält 'C'. Das 'C' ist bestimmt der Anfang von ComXX.

Wie komme ich jetzt bloss an den kompletten String?

Gruß,

Brainshock 1. Aug 2008 13:15

Re: WM_DEVICECHANGE, DBT_DEVTYP_PORT: Portnamen rausbekommen
 
Kann mir da echt keiner helfen?

DeddyH 1. Aug 2008 13:17

Re: WM_DEVICECHANGE, DBT_DEVTYP_PORT: Portnamen rausbekommen
 
Und wenn Du mal nach PChar castest?

Apollonius 1. Aug 2008 13:23

Re: WM_DEVICECHANGE, DBT_DEVTYP_PORT: Portnamen rausbekommen
 
Lass dir mal dbcp_size anzeigen.

Brainshock 1. Aug 2008 13:52

Re: WM_DEVICECHANGE, DBT_DEVTYP_PORT: Portnamen rausbekommen
 
Das mit dem casten auf PChar haut nicht hin.

dbcp_size ist 22.

Die Länge des Inhalts von dbcp_name soll man sich bestimmt mit Hilfe der dbcp_size zusammenrechnen:
Länge des Namens = dbcp_size - sizeof(dbcp_size) - sizeof(dbcp_devicetype) - sizeof(dbcp_reserved).
Hier also 22 - 4 - 4 - 4 = 10.

Richtig?

Wie bekomme ich jetzt den Text mit der richtigen Länge aus der Variablen raus?

Apollonius 1. Aug 2008 13:55

Re: WM_DEVICECHANGE, DBT_DEVTYP_PORT: Portnamen rausbekommen
 
Versuche es mal mit PChar(@PDevBroadcastPortA(Msg.LParam)^.dbcp_name[0]).

Brainshock 1. Aug 2008 14:11

Re: WM_DEVICECHANGE, DBT_DEVTYP_PORT: Portnamen rausbekommen
 
Läßt sich so nicht kompilieren: [Fehler] Array-Typ erforderlich

Brainshock 1. Aug 2008 14:13

Re: WM_DEVICECHANGE, DBT_DEVTYP_PORT: Portnamen rausbekommen
 
Aber so geht es:

Delphi-Quellcode:
var
  ComPort: PAnsiChar

ComPort:= PAnsiChar(@PDevBroadcastPortA(Msg.LParam)^.dbcp_name);
Danke, danke, danke...

DeddyH 1. Aug 2008 14:16

Re: WM_DEVICECHANGE, DBT_DEVTYP_PORT: Portnamen rausbekommen
 
Da lag ich ja gar nicht mal so verkehrt :roll:

Rudirabbit 15. Feb 2010 18:32

Re: WM_DEVICECHANGE, DBT_DEVTYP_PORT: Portnamen rausbekommen
 
Hatte neulich sowas ähnliches gebraucht

Zitat:

ComPort:= PAnsiChar(@PDevBroadcastPortA(Msg.LParam)^.dbcp_na me);
Dies hatte in meinem Fall nicht funktiontiert. :?

Wenn ich einen USB to Serial Adapter (FTDI Chip) anstecke/abstecke, und das Event ausgelöst wird, steht in Comport nichts plausibles.
An anderer Stelle hier im Forum habe ich dann eine Lösung gefunden um die VID und PID des Usbdevices zu bekommen. (Danke dafür)

Mit L.Param der Message, und Benutzung der Unit dbt (jedi). Es werden dort nur die records gebraucht.

Delphi-Quellcode:
DeviceInfoBlock := PDevBroadcastDeviceInterface(Msg.LParam);
        MyDevice := String(Pchar(@DeviceInfoBlock.dbcc_name));
Dann steht im String Mydevice die VID/PID drin.
Aber eine Info welcher Comport gerade belegt wird sehe ich dort nicht.

mfg


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:33 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