Name eines Datenträgers ermitteln ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Name eines Datenträgers ermitteln ?

Beitrag von Bisonte »

Wie kann ich den Namen des Datenträgers rausbekommen ?

Eigentlich brauch ich eher die Andere Richtung...
Sagen wir mal ich habe einen USB-Stick der hat die Datenträgerbezeichnung "USB-1" und ist Laufwerk G:\

Nun möchte ich in meinem Prg nach dem Namen suchen als nach dem Laufwerksbuchstaben, weil der sich ja auch ändern kann....

Also ein OpenFile(1,"USB-1:\Hallo.txt") geht natürlich nicht.
aber so in der art wollt ich würden wenn ich könnte ;) (Amigalike :D )
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

Code: Alles auswählen

Laufwerk.s="C:\" 
Name.s=Space(#MAX_PATH) 
GetVolumeInformation_(@Laufwerk,@Name,#MAX_PATH ,0,0,0,0,0) 
    
Debug Name.s
Vielleicht hilft es dir ja
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Helfen auf jedenfall. Thx.

Also muss ich, um rauszubekommen, welcher Buchstabe:\ den Laufwerksnamen$ hat folgendes tun:

Code: Alles auswählen

For Drive = 1 To 26
  DriveLetter.s=Chr(64+Drive)+":\"
  Name.s=Space(#MAX_PATH)
  GetVolumeInformation_(@DriveLetter,@Name,#MAX_PATH ,0,0,0,0,0)
  If Name="USB-1"
    Break
  EndIf
Next Drive

Debug DriveLetter + " = " + Name
Also diesen Code müsste ich dann theoretisch periodisch abfragen... (oder kann ich irgendwo ne WindowsMessage abgreifen, die mir sagt, dass ein Laufwerk dazugekommen ist ? Win selbst macht beim einstecken ja diesen "tollen" Ton ;) )

Edit:

Ich wollte einen Autostart für meinen USB-Stick basteln.
Da ich immer unterwegs bin, böte sich das ja an, wenn ich auf den Rechnern, die ich unterwegs nutze (eigentlich immer die gleichen) ein minitool installiere (PB ist ja bekannt für kleine exe's ;) ) das dann beim
einstecken meines USB-Sticks anspringt und mir eine kleine Startmenueähnliche Anzeige aufklappt.

Autorun.inf klappt ja leider nicht mit USB-Sticks... und Autostart kann auch abgeschaltet sein, allerdings das einstecken eines USB Sticks kriegt Windows ja immer mit.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag von PMTheQuick »

Hi Bisonte ;),

klar gibt es ne Funktion, um zu ermitteln, ob ein USB-Stick an/ab-gesteckt wurde ;)

Code: Alles auswählen

Autor: edel

#DBT_DEVICEARRIVAL        = $8000
#DBT_DEVICEREMOVECOMPLETE = $8004
#DBT_DEVTYP_VOLUME        = $0002

Procedure.s GetDevice(Bits)
  For i = 'A' To 'Z'
    If Bits & 1 = 1
      Laufwerk.s = Chr(i)
    EndIf
    Bits = Bits >> 1
  Next
  ProcedureReturn Laufwerk
EndProcedure

Procedure CB(hwnd,msg,wParam,lParam)
 
  Protected *db.DEV_BROADCAST_HDR
  Protected *dbv.DEV_BROADCAST_VOLUME
 
  If msg = #WM_DEVICECHANGE
    Select wParam
      Case #DBT_DEVICEARRIVAL       
       
        *db = lParam
       
        If *db\dbch_devicetype = #DBT_DEVTYP_VOLUME
          *dbv = *db
          Laufwerk.s = GetDevice(*dbv\dbcv_unitmask) + ":\"
          Debug Laufwerk  + " = insert Media"
        EndIf
       
      Case #DBT_DEVICEREMOVECOMPLETE
       
        *db = lParam
       
        If *db\dbch_devicetype = #DBT_DEVTYP_VOLUME
          *dbv = *db
          Laufwerk.s = GetDevice(*dbv\dbcv_unitmask) + ":\"
          Debug Laufwerk + " = remove Media"
        EndIf
       
    EndSelect
    ProcedureReturn 1
  EndIf
 
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

hwnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,200,200,"")

SetWindowCallback(@CB(),0)

Repeat : Until WaitWindowEvent() = #WM_CLOSE 
Schöne Grüsse aus der Schweiz,
Gruss
PMTheQuick ;)
Zuletzt geändert von PMTheQuick am 18.12.2007 21:16, insgesamt 2-mal geändert.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Danke erstmal ;) Du bist nicht verwandt oder verschwägert mit NicTheQuick ? :D

Mal sehen was bei diesem Code rauskommt... sitz erst morgen wieder an meiner Konsole ;)
Das würde wenigstens die Dauerabfrage der Laufwerke überflüssig machen hoff ich ...


Edit: kann man das auch per Thread laufen lassen (weil PRG läuft ja im Hintergrund ... oder wie baut man das besser ein ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

Bisonte hat geschrieben:Danke erstmal ;) Du bist nicht verwandt oder verschwägert mit NicTheQuick ? :D
Nein ist er nicht :wink:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag von PMTheQuick »

> Danke erstmal ;) Du bist nicht verwandt oder verschwägert mit NicTheQuick ? :D
>> Nein ist er nicht :wink:
Genau! ;)

> Edit: kann man das auch per Thread laufen lassen (weil PRG läuft ja im Hintergrund ... oder wie baut man das besser ein ?
Hm... Dir ist bewusst, dass die Funktion ein Window-Callback ist ;) Damit fängst du die Windows-Message's ab... Eine grosse Zeitverzögerung gibt es nicht! ;) Du kannst aber auch einen Thread machen, damit ein unsichtbares fenster erstellen und auf das den Callback setzen ;)

Gruss
PMTheQuick :)

PS: Wow sind das viele ;) Smilies :D
Zuletzt geändert von PMTheQuick am 18.12.2007 21:16, insgesamt 1-mal geändert.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Hm... Dir ist bewusst, dass die Funktion ein Window-Callback
Folgenden Ablauf hab ich mir vorgestellt :
  • - Hidewindow aufmachen und Systrayicon setzen.
    - wenn ein Stick eingestöpselt wird, soll dann...
    -- Fenster generieren (Prefsdatei auf stick) das dann über dem systray wie eine Onlinemeldung vom MSN hochscrollt mit den installierten programmen.
    -- bei klick aufs fenster, runterscrollen und das Programm vom stick starten....
und so wie ich dich verstanden habe, sollte ich den CallBack gleich nach dem öffnen des hidewindow machen und danach nicht mehr ?
oder per If Callback = sowieso dann mach alles andere ?
So ganz das prinzip der winfunktionen,callbacks und sendmessages usw hab ich noch nich durchschaut ... sry.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag von PMTheQuick »

@Bisonte... Es gibt doch WaitWindowEvent... Das sind ja Fensternachrichten! ;) Ein Callback setzt einen Procedure, wo dann erweiterte Nachrichten ankommen. Es reicht also 1x auf das versteckte Fenster den Callback zu setzen!
PB-Hilfe (F1) hat geschrieben:Nur für erfahrene Programmierer. Diese Funktion wird nur unter dem Microsoft Windows OS unterstützt.

Normale Ereignisse (Events) sollten mit den regulären Befehlen WaitWindowEvent() oder WindowEvent() verarbeitet werden.

Dieser Befehl assoziiert einen Callback ("Rückruf"), um die Ereignisse aller offenen Fenster zu verarbeiten. Alle Ereignisse werden durch diesen Callback abgefangen und können hier verarbeitet werden. Um einen Callback nur für ein bestimmtes Fenster festzulegen, kann mit dem optionalen Parameter die PB Fensternummer '#Window' übergeben werden.

Zum Entfernen/Deaktivieren eines gesetzten Callbacks rufen Sie einfach SetWindowCallback(0 [, #Window]) auf.

Warnung: dieser Weg ist "low-level". Falsche Handhabung der Nachrichten ("Messages") im Callback kann die PB-interne Nachrichten-Verarbeitung stören.
Also Fenster erstellen
Fenster verstecken
Callback setzen

Das wärs ;)

Gruss
PMTheQuick :)

PS: Falls du weitere Probs hast & falls du ICQ besitzt, 220-835-160 ;)
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

werd ich glatt machen ;) so ich muss zur arbeit :evil:
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten