AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden
Thema durchsuchen
Ansicht
Themen-Optionen

Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden

Ein Thema von Luckie · begonnen am 24. Jul 2013 · letzter Beitrag vom 25. Jul 2013
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden

  Alt 24. Jul 2013, 17:12
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden

  Alt 24. Jul 2013, 17:23
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

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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden

  Alt 24. Jul 2013, 17:29
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.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (24. Jul 2013 um 17:31 Uhr)
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#4

AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden

  Alt 24. Jul 2013, 19:27
MSDN-Library durchsuchenGetVolumeInformation liefert den Namen des Volumes:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Delphi programming
  Mit Zitat antworten Zitat
Andreas Schilling

Registriert seit: 6. Sep 2006
106 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden

  Alt 25. Jul 2013, 07:02
Um USB-Laufwerke zu finden benutze ich immer folgenden Code.
Delphi-Quellcode:
  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;
Wobei damals davon ausgegangen wurde, das immer nur ein USB-Stick am Rechner hängt. Mußt halt den Quelltext entsprechend anpassen.

Gruß Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden

  Alt 25. Jul 2013, 07:24
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;
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#7

AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden

  Alt 25. Jul 2013, 08:21
...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.

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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden

  Alt 25. Jul 2013, 09:33
Vielen Dank. Eigentlich wollte ich ja nur einen Denkanstoß haben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#9

AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden

  Alt 25. Jul 2013, 11:25
@hathor

Zitat:
// if DirectoryExists(dirName) then //geht bei mir nicht !!! UAC ???
Das verunsichert mich jetzt total. Ich verwende DirectoryExists sehr intensiv und hatte auf meinen Rechnern noch nie Probleme damit. Und auch von meinen Kunden habe ich noch keine Fehler-Rückmeldungen erhalten die darauf schließen würden, dass DirectoryExists die Ursache sein könnte.
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#10

AW: Über alle USB Anschlüsse iterieren, um ein bestimmtes Gerät zu finden

  Alt 25. Jul 2013, 12:25
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;
  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 17:29 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