![]() |
VolumeMountPoints
Hi,
Ich verzweifel noch. Kann mir jemand eindeutig erklären wie ich ![]() Bei MSDN steht zwar ein Beispiel aber sonst stehts im Internet immer anders. Klappen tut beides nicht.
Delphi-Quellcode:
GetLastError:
SetVolumeMountPoint('W:\','\C:\Test\') // oder
SetVolumeMountPoint('\C:\Test\','W:\') Zitat:
Delphi-Quellcode:
GetLastError:
SetVolumeMountPoint('W:\','\C:\Test') // oder
SetVolumeMountPoint('\C:\Test','W:\') Zitat:
Delphi-Quellcode:
GetVolumeNameForVolumeMountPoint(PChar('C:\\'),@Buffer[0],SizeOf(Buffer));
SetVolumeMountPoint('\C:\Test\',Buffer)
Delphi-Quellcode:
GetLastError:
GetVolumeNameForVolumeMountPoint(PChar('C:\\'),@Buffer[0],SizeOf(Buffer));
SetVolumeMountPoint(Buffer,'\C:\Test\') Zitat:
In Buffer steht immer sowas (oder so ähnlich halt):
Delphi-Quellcode:
Was is da jetzt noch falsch dran ?-.-
\\?\Volume{dafc6733-ff88-11d9-b411-806d6172696f}\
Gruß Neutral General |
Re: VolumeMountPoints
Delphi-Quellcode:
Bei "SetVolumeMountPoint" ist bei dir die Reihenfolge der Parameter falsch.
procedure TForm1.Button1Click(Sender: TObject);
var Buffer: array[0..50] of Char; begin if (GetVolumeNameForVolumeMountPoint(PChar('C:\\'), Buffer, SizeOf(Buffer))) then begin if (CreateDir('C:\\Test\\')) then begin if (SetVolumeMountPoint('C:\\Test\\', Buffer)) then begin MessageBox(Application.Handle, 'OK', '', MB_OK); end; end; end; end; Der Pfad zum Mount-Ordner darf kein "\" am Anfang haben. Der Ordner, in den du mounten möchtest, muss existierten, ggf. vorher anlegen. :) |
Re: VolumeMountPoints
Ok danke es geht :)
Gruß Neutral General |
Re: VolumeMountPoints
Sry für den Push aber grad is was komisches aufgetaucht... Warum geht das nur mit Ordnern auf C: ?
Bei allen anderen Festplatten geht das nicht o.O :wall: Gruß Neutral General |
Re: VolumeMountPoints
Zeig mal deinen Code, bei mir geht es überall. :)
|
Re: VolumeMountPoints
Delphi-Quellcode:
So. Aber kann man nicht auch irgendwie den Inhalt eines Ordners als Festplatte anzeigen lassen?
function MountDir(Dir: String): Boolean;
var Buffer: Array[0..MAX_PATH] of Char; DriveLetter: String; begin Result := false; DriveLetter := ExtractFileDrive(Dir) + '\\'; Dir := StringReplace(Dir,'\','\\',[rfReplaceAll]) + '\\'; if (GetVolumeNameForVolumeMountPoint(PChar(DriveLetter), Buffer, SizeOf(Buffer))) then Result := SetVolumeMountPoint(PChar(Dir),Buffer); end; Mit DefineDosDevice hab ichs probiert:
Delphi-Quellcode:
... R: Wird dann auch angezeigt im Explorer aaaber.. Man kann nicht drauf zugreifen...
if not DefineDosDevice(DDD_RAW_TARGET_PATH,'R:','C:\Test\') then
ShowMessage(SysErrorMessage(GetLastError)); Dann hab ich mal zuerst C:\Test\ gemountet und dann obigen Quelltext ausprobiert.. Bringt aber auch nix.. Hatte auch mal eine Version wo GetLastError gesagt hat das ein Analysepunkt fehlt.. Damit konnte ich aber nix anfangen :| Gruß Neutral General |
Re: VolumeMountPoints
"DefineDosDevice" dient zum Mounten von pysischen Laufwerken, z.B. "C:" auf "\Device\HarddisVolume0". :)
Das Mounten von Verzeichnissen als eigene Laufwerke hat bei mir auch nicht funktioniert. |
Re: VolumeMountPoints
Zitat:
|
Re: VolumeMountPoints
Zitat:
Gruß Neutral General |
Re: VolumeMountPoints
![]() Damit kannst du sowas machen, wie auch mit dem "DOS-Befehl" SUBST :zwinker: Als Beispiel könntest du dir ja mal ![]() Und VolumeMountPoint ... fällt dir was an dem Namen auf? ... da geht es um Volumes, also ganze Laufwerke die über 'nen Laufwerksbuchstaben (X:\), oder als Verzeichnis (X_\dir...) gemountet werden sollen ... mit Verzeichnissen is da nüschts. :angel: Verzeichnis als Laufwerk, oder Verzeichnis als anderes Verzeichnis geht damit demnach nicht. PS: \\?\Volume{dafc6733-ff88-11d9-b411-806d6172696f} dieses ist die "interne" Bezeichning, mit welcher Windows dein Laufwerk, welches bei dir als C:\ gemountet ist verwaltet. Jedes Volume (Partition) hat soeinen "Namen" und der bleibt "immer" gleich ... ist vorallem praktisch wenn das Volume mal nicht gemountet ist, so hat man dann dennoch 'ne Möglichkeit darauf zuzugreifen u.a. |
Re: VolumeMountPoints
Zitat:
Zitat:
Gruß Neutral General |
Re: VolumeMountPoints
Upss ja, ich meinte eigentlich
![]() ![]() C:\Programme\ als L:\ "mounten":
Delphi-Quellcode:
// verbinden
DefineDosDevice(DDD_RAW_TARGET_PATH, 'L:', '\??\C:\Programme'); // trennen DefineDosDevice(DDD_REMOVE_DEFINITION, 'L:', nil); kannt es ja mal bei Olli testen :angel: hier 'ne nette BatchFile (test.bat):
Code:
subst4nt.exe L: C:\Programme
pause subst4nt.exe L: -r pause |
Re: VolumeMountPoints
Hi,
Delphi-Quellcode:
... Das einzige was mir immer gefehlt hat war '\??\' vor dem eigentlichen Pfad... Ich hab mich auch tot-gegoogelt und NIRGENDWO stand das so :roll:
// verbinden
DefineDosDevice(DDD_RAW_TARGET_PATH, 'L:', '\??\C:\Programme'); // trennen DefineDosDevice(DDD_REMOVE_DEFINITION, 'L:', nil); Aber danke :) Gruß Neutral General |
Re: VolumeMountPoints
keine Sorge ... diese Variante kannte ich vor Olli's Tool auch noch nicht ... halt nur die UNC-Varianten ( \\.\ und \\?\ ) ^^
und im MSDN/PSDK is mir sowas demnach auch noch nicht untergekommen :shock: |
AW: VolumeMountPoints
Zitat:
hi Neutral General , hast du nu rausgefunden wie du die GUID herrausbekommst??? bei mir kommt immer ne fehlermeldung der ntdll.dll.
Delphi-Quellcode:
Function GetVolumeNameForVolumeMountPoint(
lpszVolumeMountPoint: PAnsiChar; lpszVolumeName: PAnsiChar; cchBufferLength: DWORD): Boolean; stdcall; external 'C:\Windows\SysWOW64\kernel32.dll' name 'GetVolumeNameForVolumeMountPointA';
Delphi-Quellcode:
procedure TForm1.Button21Click(Sender: TObject);
var vmp : PAnsiChar; vn : PAnsiChar; i : cardinal; begin vmp := ('D:\\'); //GetVolumeNameForVolumeMountPoint(vmp, vn, i); GetVolumeNameForVolumeMountPoint(vmp,vn, i); // GetVolumeNameForVolumeMountPoint(PChar('C:\\'),@Buffer[0],SizeOf(Buffer)); ListBox2.Items.Add( string( vn)); end; |
AW: VolumeMountPoints
Hallo,
Habs grad ausprobiert und bei mir gehts so:
Delphi-Quellcode:
Der Fehler war, dass du für den Volume name Speicher bereitstellen musst. Bei mir sind es die 101 Bytes/AnsiChars des "Buffer"-Arrays. Im 3. Parameter musst du die länge des Buffers übergeben den du bereitstellst. Da hast du einfach das uninitialisierte "i" übergeben in der irgendeine beliebige Zahl drin stehen kann.
procedure TForm1.Button1Click(Sender: TObject);
var Buffer: Array[0..100] of AnsiChar; // Je nachdem wie viel du willst/kannst/sollst begin GetVolumeNameForVolumeMountPoint('D:\\',@Buffer[0], Length(Buffer)); Caption := Buffer; // \\?\Volume{6f55826c-bfa1-11e1-86d0-20cf30e33243}\ end; Daher hat Windows versucht in nicht angeforderten Speicher zu schreiben, was mit einer Exception geendet hat. |
AW: VolumeMountPoints
ein RIESIGEN DANK AN DICH... endlich , hab seit 5 tagen probiert und gelesen.
:thumb::thumb::thumb::thumb::thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz