![]() |
Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden
Ich habe ein GPS Empfänger, den ich regelmäßig mit neuen Daten (GPX-Dateien) bestücke. Der GPSEmpfänger wird per USB an den Rechner angeschlossen. Um nun neue GPX-Dateien auf das gerät zu kopieren sind folgende Schritte notwendig:
1. Dateien runter laden (gepackt) 2. entpacken 3. alte Dateien auf dem Gerät löschen 4. neue Dateien auf das Gerät kopieren. Dies wollte ich jetzt automatisieren. Ich wähle nur noch das Archiv aus und den Rest macht das Programm von alleine. Da aber nicht immer sicher gestellt ist, dass das Gerät auch immer den gleichen Laufwerksbuchstaben bekommt, muss ich wissen welchen Laufwerksbuchstaben es hat, wenn es angeschlossen ist. Dazu müsste ich über alle USB Ports iterieren und bei jedem gucken, ob es das gewünschte Gerät ist. Meine Frage, hat jemand schon mal so was gemacht bzw. mit welchen API Funktionen würde man das machen? |
AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden
Selbst wenn man ein Gerät an einem "Port" findet, bringt einen das doch zunächst nicht wirklich weiter, wenn man im Endeffekt doch eine Datei auf ein Laufwerk schieben will? Allein von dort aus weiter zu kommen stelle ich mir schon ziemlich schwierig vor.
Wenn du von "Laufwerk" sprichst, dann bindet sich das USB-Teil doch als FAT oder NTFS-Massenspeicher ein? Ich hätte einmal eine (unsichtbare?) Textdatei auf das Laufwerk gespackt um es wiederzuerkennen :stupid: Ich hätte in meinem Programm dann ein "Gerät für Automatismus einrichten", der packt dann im Endeffekt nur einmal eine autorun.ini mit einem coolen Symbol auf das Laufwerk und um es beim Synchronisieren wiederzufinden muss ich nur mir nur Windows-Laufwerke anschauen, egal ob USB oder sonstwas. Wahrscheinlich rede ich gerade Dünpfiff. |
AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden
Ja es erscheint im Explorer als Laufwerk. Und ich brauche jetzt den Laufwerksbuchstaben.
Nein, ist kein Dünnpfiff. Ich könnte über alle Laufwerke iterieren und den Namen abfragen, bis ich das Laufwerk mit dem richtigen Namen gefunden habe. |
AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden
![]() ![]() |
AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden
Um USB-Laufwerke zu finden benutze ich immer folgenden Code.
Delphi-Quellcode:
Wobei damals davon ausgegangen wurde, das immer nur ein USB-Stick am Rechner hängt. Mußt halt den Quelltext entsprechend anpassen.
uses windows
procedure ... var strUSB_Drive : string; DriveList : TStringList; s: Char; //----------------------------- function GetDrives(var LW_List : TStringlist; DriveType:BYTE):byte; var Drives : array [1..255] of char; LWListe : TStringList; i : byte; Len : DWord; begin LWListe:=TStringList.Create; {Alle Laufwerke ermitteln} Len:=GetLogicalDriveStrings(255,@Drives); for i:=1 to Len-2 do if (i mod 4)=1 then LWListe.Add(copy(Drives,i,3)); {Laufwerke des angegebenen Typs zählen} Result:=0; LW_list.Clear; for i:=0 to LWListe.Count-1 do begin if GetDriveType(PChar(LWListe[i]))= DriveType then begin Result:=Result+1; LW_List.Add(copy(LWListe[i],1,2)) end; end; LWListe.Destroy; end; //------------------ begin DriveList:=TStringLIst.Create; {Wechselplatten:} GetDrives(Drivelist, DRIVE_REMOVABLE); if DriveList.count > 0 then begin strUSB_Drive := ''; for i := 0 to drivelist.count - 1 do begin if (DriveList[i] <> 'A:') and (DriveList[i] <> 'B:') then strUSB_Drive := DriveList[i]; end; if strUSB_Drive = '' then begin ShowMessage('Kein Wechseldatenträger an diesem Rechner angeschlossen'); exit; end; S := strusb_Drive[1]; end else begin ShowMessage('Kein Wechseldatenträger an diesem Rechner angeschlossen'); exit; end; DriveList.Free; .... end; Gruß Andreas |
AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden
Sofern du es wirklich voll automatisch haben und nicht ständig pollen willst, dann schau dir mal WM_DEVICECHANGE an..
Delphi-Quellcode:
type
TForm1 = class(TForm) public procedure DeviceChange(var Msg: TMessage); message WM_DEVICECHANGE; end; // ...... const DBT_DEVICEARRIVAL = $8000; DBT_DEVTYP_VOLUME = $02; type _DEV_BROADCAST_HDR = record dbch_size: DWORD; dbch_devicetype: DWORD; dbch_reserved: DWORD; end; PDevBroadcastHdr = ^TDevBroadcastHdr; TDevBroadcastHdr = _DEV_BROADCAST_HDR; _DEV_BROADCAST_VOLUME = record dbcv_size: DWORD; dbcv_devicetype: DWORD; dbcv_reserved: DWORD; dbcv_unitmask: DWORD; dbcv_flags: WORD; end; PDevBroadcastVolume = ^TDevBroadcastVolume; TDevBroadcastVolume = _DEV_BROADCAST_VOLUME; function BitScanForward(Value: Integer): Integer; asm bsf eax, eax end; procedure TForm1.DeviceChange(var Msg: TMessage); var DriveLetter: Char; begin case Msg.WParam of DBT_DEVICEARRIVAL: if PDevBroadcastHdr(Msg.LParam).dbch_devicetype = DBT_DEVTYP_VOLUME then begin DriveLetter := Char(65 + BitScanForward(PDevBroadcastVolume(Msg.LParam).dbcv_unitmask)); ShowMessage('New device plugged in: ' + DriveLetter); // ShowMessage('DriveType: ' + IntToStr(GetDriveType(pChar(DriveLetter + ':')))); end; end; end; |
AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden
Zitat:
Delphi-Quellcode:
function DriveExists(DriveByte: Byte): Boolean;
begin Result := GetLogicalDrives and (1 shl DriveByte) <> 0; end; function FileDirExists(const FileOrDir: String): Boolean; var FindFileData: TWIN32FindData; begin FindFileData.dwFileAttributes := INVALID_FILE_ATTRIBUTES; Windows.FindClose(FindFirstFile(PChar(FileOrDir), FindFileData)); Result := FindFileData.dwFileAttributes = INVALID_FILE_ATTRIBUTES; end; Function FindGPS: String; var dirName: String; i : Integer; begin dirName:= 'F-Hathor'; //Dir, das sonst nirgendwo existiert ausser im GPS-Empfänger Result:='GPS-Empfänger NICHT gefunden.'; for i:=0 to 25 do begin if DriveExists(i) then // if DirectoryExists(dirName) then //geht bei mir nicht !!! UAC ??? if FileDirExists(dirName) then begin Result:= 'GPS-Empfänger gefunden bei '+ IntToStr(i); end; end; Form1.Label1.caption:=Result; end; |
AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden
Vielen Dank. Eigentlich wollte ich ja nur einen Denkanstoß haben. ;)
|
AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden
@hathor
Zitat:
|
AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden
WIN 8 - 64Bit
DELPHI 2009 Vielleicht gibt es unterschiedliche Versionen. Meine sieht so aus:
Delphi-Quellcode:
function DirectoryExists(const Directory: string): Boolean; //SysUtils.pas in Delphi 2009
var Code: Cardinal; begin Code := GetFileAttributes(PChar(Directory)); Result := (Code <> INVALID_FILE_ATTRIBUTES) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 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