WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   VB5-nicht mehr vorhandenes USB-LW wird gefunden (http://www.wcm.at/forum/showthread.php?t=145317)

reemrev 20.09.2004 23:00

VB5-nicht mehr vorhandenes USB-LW wird gefunden
 
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

JackLemon 21.09.2004 16:44

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...

wbendl 21.09.2004 19:10

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

reemrev 21.09.2004 19:30

@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(?)

wbendl 21.09.2004 21:19

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

reemrev 21.09.2004 22:48

Das wäre interessant, werde mal auf einem anderen Computer testen.

wbendl 22.09.2004 15:30

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

wbendl 22.09.2004 16:11

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

reemrev 22.09.2004 16:35

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 :D

wbendl 23.09.2004 09:31

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


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag