![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Inventar
![]() |
![]() Hab das was programmiert, bei Programmstart wird überprüft, ob ein USB-Stick angeschlossen ist, wenn ja, dann wird dieser Pfad (hier "G:\") eingelesen, funktioniert, aber, jetzt kommt das Problem:
Wenn ich das Progamm beende, den USB-Stick sicher(!) entferne und das Programm wieder starte, wird scheinbar der Stick als noch vorhanden erkannt. (Es kommt dann zu einer Fehlermeldung, weil mein Programm versucht, eine Datei auf das nicht vorhandene Laufwerk "G:\" zu schreiben) In der Datenträgerverwaltung scheint Laufwerk "G:\" nicht auf, in der von mir verwendeten API Funktion hingegen schon. Was hats da?? Declare Function GetLogicalDriveStrings Lib "kernel32" Alias _ "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, _ ByVal lpBuffer As String) As Long |
![]() |
![]() |
![]() |
#2 |
Senior Member
![]() Registriert seit: 02.11.2002
Beiträge: 179
|
![]() mag jetzt vielleicht ein bisschen naiv klingen, aber - wieso fängst du den fehler nicht einfach ab und schließt daraus dass es nicht verfügbar ist?? oder verwend' irgendwas wie dir() um die tatsächliche verfügbarkeit zu prüfen...
____________________________________
It\'s not a bug... It\'s a feature! You know, the main advantage of encrypted paella over ordinary paella is that nobody but you knows what you are eating... (Alvaro) |
![]() |
![]() |
![]() |
#3 |
Master
![]() Registriert seit: 22.03.2000
Alter: 66
Beiträge: 550
|
![]() Hi!
Poste mal den Code, in dem du die Rückgabe von GetLogicalDriveStringsA auswertest. Wahrscheinlich ist da das Problem. Außerdem empfehle ich dir, das Vorhandensein des Sticks nicht nur beim Programmstart, sondern vor jedem Zugriff zu prüfen. mfg WB |
![]() |
![]() |
![]() |
#4 |
Inventar
![]() |
![]() @wbendl
Das ist der Code: Public Sub GetAllDrives() Dim sBuffer As String * 255 Dim sDrives As String Dim lResult As Long Dim sDrive As String Dim sPos As Integer lResult = GetLogicalDriveStrings(Len(sBuffer), sBuffer) sDrives = Left$(sBuffer, lResult) While Len(sDrives) > 0 sPos = InStr(sDrives, Chr$(0)) sDrive = Left$(sDrives, sPos - 1) sDrives = Mid$(sDrives, sPos + 1) If LaufwerksTyp(sDrive) = "Wechseldatenträger" And Left$(sDrive, 2) <> "A:\" And Left$(sDrive, 2) <> "B:\" Then pfad = sDrive Else pfad = App.Path End If Wend End Sub @jacklemon: da der Stick manchmal auch leer sein kann, müsste man versuche eine Datei anzulegen, wenn das nicht geht ist eben kein Stick da(?) |
![]() |
![]() |
![]() |
#5 |
Master
![]() Registriert seit: 22.03.2000
Alter: 66
Beiträge: 550
|
![]() Hi!
Der Code scheint OK zu sein. Im Abschnitt If LaufwerksTyp(sDrive) = "Wechseldatenträger" And Left$(sDrive, 2) <> "A:\" And Left$(sDrive, 2) <> "B:\" Then pfad = sDrive Else pfad = App.Path End If steckt die Gefahr, daß der Stick unter bestimmten Umständen ignoriert wird. Das ist aber nicht das aktuelle Problem. Um es wirklich auszuprobieren fehlt mir aber ein USB-Stick. Würde mich aber auch echt interessieren. Auch zum Vergleich mit eigenem Code, der alle LW auflistet. Als Workaround hilft wohl am Besten ein Schreibversuch. Damit ist das Vorhandensein sichergestellt. Vielleicht kann ich so einen Stick organisieren. Dann probier ich das bei mir aus, und melde mich noch mal. mfg WB |
![]() |
![]() |
![]() |
#6 |
Inventar
![]() |
![]() Das wäre interessant, werde mal auf einem anderen Computer testen.
|
![]() |
![]() |
![]() |
#7 |
Master
![]() Registriert seit: 22.03.2000
Alter: 66
Beiträge: 550
|
![]() Hi!
Nachdem meine Neugier übermächtig war, habe ich mir einen USB-Stick zugelegt. Getestet habe ich mit Win2000/SP4. Die Rückgabe von GetLogicalDriveStrings ist korrekt. Nicht testen kann ich den Abschnitt, in dem LaufwerksTyp verwendet wird. Diesen Abschnitt würde ich an deiner Stelle nochmal überdenken. Aber das ist ein anderes Problem. Ich schau jetzt, ob ich einen XP-Rechner zum Testen auftreiben kann. mfg WB |
![]() |
![]() |
![]() |
#8 |
Master
![]() Registriert seit: 22.03.2000
Alter: 66
Beiträge: 550
|
![]() Hi!
Es funktioniert auch mit XP. Wie bereits vermutet, ist der Abschnitt If LaufwerksTyp(sDrive) = "Wechseldatenträger" And Left$(sDrive, 2) <> "A:\" And Left$(sDrive, 2) <> "B:\" Then pfad = sDrive Else pfad = App.Path End If eine Fehlerquelle. Wenn der Stick nicht das letzte LW ist, ist das Ergebnis falsch. Im konkreten Fall gibt es auf dem Rechner ein Netz-LW U:\. Der Stick hat G:\. Wenn jetzt der Code in der Schleife durchlaufen wird, ist die Bedingung beim letzten Durchlauf nicht erfüllt. Fazit: Verändere den Code dahin, daß nicht das letzte LW entscheidend ist. mfg WB |
![]() |
![]() |
![]() |
#9 |
Inventar
![]() |
![]() Vielen Dank, dass du dir die Mühe gemacht hast. Das mit dem letzten LW ist richtig, dürfte aber nur dann passieren, wenn nach dem USB-Stick ein weiteres Wechsellaufwerk angeschlossen wird (Denkfehler?).
Mittlerweile bin ich wieder von der automatischen Erkennung abgekommen, denn wenn ich vergesse, den Stick wieder anzustecken, dann schreibt das Programm automatisch auf der Festplatte weiter, dh. ich habe dann zwei gleiche Dateien mit verschiedenem Inhalt. In der Therorie hätte das wunderbar geklappt, in der Praxis hat sich aber herausgestellt, dass ich wegen der vielen Ablenkungen am Arbeitsplatz vergesse, den Stick wieder anzustecken ![]() |
![]() |
![]() |
![]() |
#10 |
Master
![]() Registriert seit: 22.03.2000
Alter: 66
Beiträge: 550
|
![]() Hi!
Davon würde ich mich nicht abhalten lassen. Auf die Vergesslichkeit kannst du mit einer Meldung reagieren. Wichtiger ist, daß die Erkennung zuverlässig funktioniert. (Außerdem bin ich neugierig. Ich will wissen wo das Problem liegt.) mfg WB |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|