Seite 1 von 2
Name eines Datenträgers ermitteln ?
Verfasst: 14.12.2007 23:32
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

)
Verfasst: 15.12.2007 00:00
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
Verfasst: 15.12.2007 00:41
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.
Verfasst: 15.12.2007 15:26
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

Verfasst: 15.12.2007 17:22
von Bisonte
Danke erstmal

Du bist nicht verwandt oder verschwägert mit NicTheQuick ?
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 ?
Verfasst: 15.12.2007 17:26
von RSBasic
Bisonte hat geschrieben:Danke erstmal

Du bist nicht verwandt oder verschwägert mit NicTheQuick ?
Nein ist er nicht

Verfasst: 15.12.2007 17:42
von PMTheQuick
> Danke erstmal

Du bist nicht verwandt oder verschwägert mit NicTheQuick ?

>> Nein ist er nicht

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

Verfasst: 15.12.2007 18:13
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.
Verfasst: 15.12.2007 18:34
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

Verfasst: 15.12.2007 19:46
von Bisonte
werd ich glatt machen

so ich muss zur arbeit
