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

reemrev 23.09.2004 14:44

Warum das fehlende Laufwerk angezeigt wurde, lässt sich derzeit trotz intensiver Tests nicht rekonstruieren, die USB Erkennung funktioniert derzeit einwandfrei.

Hab's umgeschrieben, das Programm wird nur gestartet, wenn der Stick vorhanden ist, alle 10sec wird überprüft, ob dieser noch dran ist, fehlt er, wird automatisch die Datei auf Festplatte gesichert und die Oberfläche gesperrt. Erst wenn der Stick wieder angesteckt ist, wird diese Sperre über einen mitlaufenden Timer aufgehoben.
Eine Frage hätte ich noch: wie kann man einen PC verlässlich (Maus&Tastatur) für ONUs sperren? Versuche gerade die diese Function: BlockInput Lib "user32" (ByVal fBlock As Boolean) As Boolean. Leider kann man diese Sperre mit Strg-Alt-Entf umgehen.

JackLemon 29.09.2004 01:15

keine chance. du kannst zwar die workstation ohne weiteres locken (primitivst mit "rundll32.exe user32,LockWorkStation"), aber wie ent-lockst du sie dann wieder? ansonsten gibt's definitiv keine möglichkeit, weil strg-alt-del genau aus diesem einen grund (_alle_ programme zu umgehen) eingerichtet wurde. kannst dich aber auch mal ins winlogon sdk reingraben...


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:39 Uhr.

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