Fehlerhafte Rückgabe für akt. LW beim Ausführen von GetVolumeInformation()
-
Hallo allerseits!
Habe einen interessanten aber auch ärgerlichen Bug bei o.g. Funktion gefunden.
Rufe ich GetVolumeInformation() zum Beispiel aus einer Anwendung aus auf, die unter *d:\ordner* gespeichert ist, so liefert die Funktion mir für das Laufwerk *d:* einfach nur Müll. Für alle anderen Laufwerke bekomme ich (zumindest anscheinend) richtige Werte. Rufe ich die Anwendung allerdings von *d:* aus auf, dann bekomme ich auch für *d:* vernünftige Werte.
Habe unter XP SP2 entwickelt und getestet.Was meint ihr dazu?!? Hat jemand eine Idee/Lösung, wie ich dieses Problem umschiffen kann?
Gruß, Oli
-
Was ist Müll? Wo ist der Quelltext?

-
Ja, ist ein guter Punkt

Dies ist also die Funktion, die ich aufrufe:
DWORD s_lpFileSystemFlags; TCHAR drive[64]; TCHAR s_lpVolumeName[MAX_PATH]; TCHAR s_lpFileSystemNameBuffer[MAX_PATH]; // Edit->Text enthält zum Aufrufzeitpunkt einen einzelnen Buchstaben, z.B. 'd' _splitpath( (Edit1->Text+":\\").c_str(), drive, NULL, NULL, NULL ); GetVolumeInformation( drive, s_lpVolumeName, MAX_PATH, NULL, NULL, &s_lpFileSystemFlags, s_lpFileSystemNameBuffer, MAX_PATH); // Fehlerbehandlung und -ausschrift DWORD error = GetLastError(); TCHAR szBuf[512]; LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); wsprintf(szBuf, "error %d: %s", error, lpMsgBuf); // Ausgabe in Nachrichtenfenster Memo2->Lines->Add(AnsiString(szBuf)); LocalFree(lpMsgBuf); //...Im Fehlerfalle (wie im ersten Beitrag beschrieben) tritt der "error 123: Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch." auf und er gibt für alle im Funktionsaufruf abgerufenen Werte halt Stringmüll a la "ÿÿ" zurück. Die Ausgabe habe ich in ein TMemo gepackt (BCB).
Was sagt ihr?Gruß, Oli und schönes Wochenende
der alte witz...
-
drive muss ein Pfad und keine Laufwerksangabe sein, es fehlt also noch der Backslash (d:\). Vergisst man diesen, so schlägt die Funktion aus irgendwelchen geheimen,WinAPI-internen Gründen auf dem aktuellen Laufwerk in einem Unterverzeichnis fehl.

-
den doppelpunkt und backslash habe ich ja angefügt:
[cpp]_splitpath( (Edit1->Text+":\").c_str(), drive, NULL, NULL, NULL );[/cpp]das ist leider nicht des rätsels lösung. der driveletter ist schon in ordnung, ich lasse ihn mir ja sicherheitshalber auch noch mal ausgeben und er ist, wie er sein sollte, also **d:**.
Wie gesagt, die Funktion arbeitet korrekt für alle Laufwerke, außer für das, von dem aus das Programm gerufen wird...Gruß, Oli
-
Mag sein, dass dein Ursprungspfad richtig ist, aber du nutzt ja die Funktion splitpath und die hängt an drive eben keinen Backslash ran.
#include <iostream> int main() { char *drive = new char[10]; _splitpath( "d:\\unsorted\\tmp\\123.test" , drive, NULL, NULL, NULL ); std::cout << drive; std::cin.get(); }Ausgabe:
d:
-
Mag sein, dass dein Ursprungspfad richtig ist, aber du nutzt ja die Funktion splitpath und die hängt an drive eben keinen Backslash ran.
ja, da hast du den nagel auf den kopf getroffen. leider habe ich vorher immer nur daneben gehauen. sorry für den aufwand.

aber auch danke fürs justieren des hammers

gruß, oli