Entwickler-Ecke
Windows API - Laufwerksbuchstaben vs. Mountspoints
maxk - Mi 02.06.04 18:13
Titel: Laufwerksbuchstaben vs. Mountspoints
Hallo,
damit
die Diskussion [
http://www.delphi-forum.de/viewtopic.php?p=153205] nicht in den FAQ weitergeht, erstelle ich einfach mal 'nen neuen Beitrag.
Ich denke schon, dass es sinnvoll ist, gemountete "Laufwerksverzeichnisse" zusammen mit "normalen" Laufwerken in einer Liste zu haben. Man denke hier an Linux, beidem es sogesehen sowieso immer nur ein Laufwerk geben würde (/). Trotzdem zeigen viele Programme auch die anderen Partitionen an, um einen besseren Überblick über die Speicherverteilung zu bekommen. Ich habe mir z.B. eine Partition C:\Programme\Delphi angelegt, damit ich Delphi nicht bei jeder Windowsinstallation neu installieren muss. Einen eigenen Buchstaben sollte die Partition nicht erhalten, damit der Arbeitsplatz nicht so überfüllt aussieht. Beim Speichern muss ich nun jedoch jedesmal den vollen Verzeichnisnamen eingeben, was sehr nervig ist. Das Auswählen aus einer Liste ist bestimmt schneller und einfacher.
MathiasSimmack hat folgendes geschrieben: |
Das heißt, die Funktion könnte durchaus einmal mehrere Namen zurückliefern, die alle durch #0 voneinander getrennt sind und mit #0#0 enden. Das ignoriert dein o.g. Beispielaufruf und liefert grundsätzlich nur den ersten Namen zurück. |
Warum soll den ein Mountpunkt mehrmals in einer Liste erscheinen, wenn es sich jedesmal um den selben handelt?
maxk
Delete - Mi 02.06.04 21:47
Deswegen schrieb ich ja im FAQ-Bereich:
MathiasSimmack hat folgendes geschrieben: |
Ich gebe zu, ich habe mich mit dem Thema "Mounting" unter 2000/XP bisher noch nicht beschäftigt. Evtl. klärst du mich mal auf. |
;)
Zugegeben, warum sollte die Funktion mehrfach den gleichen Namen zurückliefern. Allerdings habe ich mir weder die Funktion noch die Beschreibung im PSDK ausgedacht. Du solltest also berücksichtigen, dass es mehrere Ergebnisse geben kann.
Vielleicht können das auch unterschiedliche Namen sein, was wohl bedeuten würde, dass man verschiedene Objekte ins gleiche Volume mounten kann? Keine Ahnung. Ich sagte ja: Ich weiß es nicht, aber im PSDK/MSDN steht
Zitat: |
The GetVolumePathNamesForVolumeName function retrieves a list of path names for the specified volume name. |
Wenn das nur ein Name ist, kein Problem
Sind es mehrere Namen (warum auch immer?), auch kein Problem.
FAlter hat folgendes geschrieben: |
Ansonsten würde ich aber auch dazu tendieren, die gemounteten Verzeichnisse nicht in die Liste mit einzubeziehen. |
Im Prinzip sehe ich das auch so, denn als Laufwerke in dem Sinn zählen sie dann ja wohl nicht. Zumal das Beispiel von max
k ja auch eine Partition ist, die keinen Laufwerksbuchstaben hat. Und wer ein
vorhandenes Laufwerk (mit eigenem Buchstaben) noch mal mountet, der hat es ja ohnehin in der Liste.
Ein anderes Problem ist aber auch, dass sich "GetVolumePathNamesForVolumeName" eben auch nur ab Windows XP nutzen lässt. 2000-User können zwar die einzelnen Volumes auflisten. Aber sie können die Funktion nicht nutzen, um den oder die Pfade zu ermitteln.
Auch ein Punkt, den man berücksichtigen sollte.
Geändert von mir: K auf Hinweis von maxk ergänzt. ;)
maxk - Mi 02.06.04 22:09
Ich heiße maxk :twisted: 8)
Okay zum Thema: Man kann einer Partition sowohl Laufwerksbuchstaben alsauch Verzeichnisse zuordnen. Ich kann sogar HDA1 als C: und C:\Test mounten. Dann entsteht eine "Kettenreaktion", was manchmal ganz praktisch ist...
MathiasSimmack hat folgendes geschrieben: |
Ein anderes Problem ist aber auch, dass sich "GetVolumePathNamesForVolumeName" eben auch nur ab Windows XP nutzen lässt. 2000-User können zwar die einzelnen Volumes auflisten. Aber sie können die Funktion nicht nutzen, um den oder die Pfade zu ermitteln.
Auch ein Punkt, den man berücksichtigen sollte. |
Naja, Windows XP User sind hier eindeutig im Vorteil :tongue:
Delete - Mi 02.06.04 23:34
maxk hat folgendes geschrieben: |
Ich heiße maxk :twisted: 8) |
Okay. Ich dachte nur, ich kann es weglassen, weil dich deine Eltern sicher nicht Maxk genannt haben. Oder? ;)
Zitat: |
Okay zum Thema: Man kann einer Partition sowohl Laufwerksbuchstaben alsauch Verzeichnisse zuordnen. Ich kann sogar HDA1 als C: und C:\Test mounten. Dann entsteht eine "Kettenreaktion", was manchmal ganz praktisch ist... |
Ich kann leider gar nichts mounten. :cry: Ich hab´s mit der entsprechenden Funktion versucht, aber die liefert mir leider immer
false zurück. Jetzt wäre die Frage ob ich versehentlich einen Dienst o.ä. deaktiviert habe, das dafür zuständig ist, dass man mounten kann. :?
Zitat: |
Naja, Windows XP User sind hier eindeutig im Vorteil :tongue: |
Da ich XP habe, stört´s mich nicht weiter. Aber man könnte bei Gelegenheit auch mal das Beispiel aus dem PSDK nach Delphi umsetzen. Das funktioniert ohne die XP-Funktion, soll aber trotzdem die Pfade anzeigen.
maxk - Do 03.06.04 13:46
MathiasSimmack hat folgendes geschrieben: |
Ich kann leider gar nichts mounten. :cry: Ich hab´s mit der entsprechenden Funktion versucht, aber die liefert mir leider immer false zurück. Jetzt wäre die Frage ob ich versehentlich einen Dienst o.ä. deaktiviert habe, das dafür zuständig ist, dass man mounten kann. :? |
Bevor du mit API-Funktionen experimentierst, solltest du es erstmal auf gewöhnliche Weise machen: Erstmal brauchst du eine NTFS-Partition, in die du die Partitionen einhängen willst. Dann gehste in Computerverwaltung/Datenträgerverwaltung und klickst die einzuhängende Partition mit rechts an. Anschließend
Laufwerksbuchstabe und -pfade ändern und du bekommst ein Fenster, in dem du nur noch auf
Hinzufügen klicken musst. Wenn du an dieser Stelle angekommen bist, sollte es eigentlich fast von alleine gehen... :roll:
Delete - Do 03.06.04 18:17
Die gewöhnliche Weise ... wie gewöhnlich ... ;)
Folgendes basiert auf dem Beispiel im PSDK
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72:
| {$APPTYPE CONSOLE} program mount;
uses Windows;
type TGetVolumeNameForVolumeMountPoint = function(lpszVolumeMountPoint, lpszVolumeName: PAnsiChar; cchBufferLength: dword): bool; stdcall; TSetVolumeMountPoint = function(lpszVolumeMountPoint, lpszVolumeName: PAnsiChar): bool; stdcall; const szKernelDll = 'kernel32.dll'; BUFSIZE = MAX_PATH; var GetVolumeNameForVolumeMountPoint : TGetVolumeNameForVolumeMountPoint = nil; SetVolumeMountPoint : TSetVolumeMountPoint = nil; dll : dword = 0; buf : array[0..BUFSIZE]of char; bFlag : boolean = false; begin if(paramcount = 0) then begin WriteLn('mounts a volume at a mount point.'); WriteLn('for example, "mount c:\mnt\fdrive\ f:\');
exit; end;
dll := LoadLibrary(szKernelDll); if(dll <> 0) then try GetVolumeNameForVolumeMountPoint := GetProcAddress(dll, 'GetVolumeNameForVolumeMountPointA'); SetVolumeMountPoint := GetProcAddress(dll, 'SetVolumeMountPointA');
if(@GetVolumeNameForVolumeMountPoint = nil) or (@SetVolumeMountPoint = nil) then exit;
bFlag := GetVolumeNameForVolumeMountPoint(pchar(paramstr(2)),buf,BUFSIZE); if(not bFlag) then begin WriteLn('Retrieving volume name for "' + paramstr(2) + '" failed.'); exit; end;
WriteLn('Volume name of "' + paramstr(2) + '" is "' + buf + '"');
bFlag := SetVolumeMountPoint(pchar(paramstr(1)),buf); if(not bFlag) then WriteLn('Attempt to mount "' + paramstr(2) + '" at "' + paramstr(1) + '" failed.'); finally FreeLibrary(dll); end; end. |
:)
Delete - Do 03.06.04 22:08
Und das Gegenstück (auch auf der Basis des PSDK-Beispiels):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| {$APPTYPE CONSOLE} program unmount;
uses Windows;
type TDeleteVolumeMountPoint = function(lpszVolumeMountPoint: PAnsiChar): bool; stdcall; const szKernelDll = 'kernel32.dll'; szSuccessMsg : array[boolean]of string = ('failed','succeeded'); BUFSIZE = MAX_PATH; var DeleteVolumeMountPoint : TDeleteVolumeMountPoint = nil; dll : dword = 0; bFlag : boolean = false; begin if(paramcount = 0) then begin WriteLn('unmounts a volume from the volume mount point.'); WriteLn('E.g. unmount c:\mnt\fdrive\');
exit; end;
dll := LoadLibrary(szKernelDll); if(dll <> 0) then try DeleteVolumeMountPoint := GetProcAddress(dll,'DeleteVolumeMountPointA'); if(@DeleteVolumeMountPoint = nil) then exit;
bFlag := DeleteVolumeMountPoint(pchar(paramstr(1)));
WriteLn('unmount ' + szSuccessMsg[bFlag] + ' in unmounting ' + 'the volume at "' + paramstr(1) + '"'); finally FreeLibrary(dll); end; end. |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!