Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.14.141.228] |
|
Сообщ.
#1
,
|
|
|
Пишу:
{$APPTYPE CONSOLE} uses Windows; function FindFirstVolume(lpszVolumeName: LPSTR; cchBufferLength: DWORD): THandle; stdcall; external kernel32 name 'FindFirstVolumeA'; function FindNextVolume(hFindVolume: THandle; lpszVolumeName: LPSTR; cchBufferLength: DWORD): BOOL; stdcall; external kernel32 name 'FindNextVolumeA'; function FindVolumeClose(hFindVolume: THandle): BOOL; stdcall; external kernel32; function FindFirstVolumeMountPoint(lpszRootPathName, lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): THandle; stdcall; external kernel32 name 'FindFirstVolumeMountPointA'; function FindNextVolumeMountPoint(hFindVolumeMountPoint: THandle; lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): BOOL; stdcall; external kernel32 name 'FindNextVolumeMountPointA'; function FindVolumeMountPointClose(hFindVolumeMountPoint: THandle): BOOL; stdcall; external kernel32; var Vol, Point: array [0..1023] of AnsiChar; VH, PH: THandle; begin VH := FindFirstVolume(Vol, SizeOf(Vol)); if VH = INVALID_HANDLE_VALUE then begin WriteLn('No volumes found!'); Exit; end; repeat WriteLn(Vol); PH := FindFirstVolumeMountPoint(Vol, Point, SizeOf(Point)); if PH = INVALID_HANDLE_VALUE then WriteLn(' No mounted folders.') else begin repeat WriteLn(' ', Point); until not FindNextVolumeMountPoint(PH, Point, SizeOf(Point)); FindVolumeMountPointClose(PH); end; WriteLn; until not FindNextVolume(VH, Vol, SizeOf(Vol)); FindVolumeClose(VH); ReadLn; end. Выдаёт GUID томов, но точек подключения нет. Почему? Что не так? А вот функция GetVolumePathNamesForVolumeName работает... Добавлено p.s. Это пускается из-под D7. Если убрать объявления функций и компилить через Tokyo (PWideChar), результат тот же. |
Сообщ.
#2
,
|
|
|
Jin X
Если просто, то эта функция делает не то о чём вы подумали. Это особые папки которые есть только в NFTS. Что-бы увидеть их с начало создать надо. {$APPTYPE CONSOLE} uses Windows; function FindFirstVolume(lpszVolumeName: LPSTR; cchBufferLength: DWORD): THandle; stdcall; external kernel32 name 'FindFirstVolumeA'; function FindNextVolume(hFindVolume: THandle; lpszVolumeName: LPSTR; cchBufferLength: DWORD): BOOL; stdcall; external kernel32 name 'FindNextVolumeA'; function FindVolumeClose(hFindVolume: THandle): BOOL; stdcall; external kernel32; function FindFirstVolumeMountPoint(lpszRootPathName, lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): THandle; stdcall; external kernel32 name 'FindFirstVolumeMountPointA'; function FindNextVolumeMountPoint(hFindVolumeMountPoint: THandle; lpszVolumeMountPoint: LPSTR; cchBufferLength: DWORD): BOOL; stdcall; external kernel32 name 'FindNextVolumeMountPointA'; function FindVolumeMountPointClose(hFindVolumeMountPoint: THandle): BOOL; stdcall; external kernel32; function GetVolumeNameForVolumeMountPoint(lpszVolumeMountPoint: LPSTR; lpszVolumeName: LPSTR; cchBufferLength: DWORD): Bool; stdcall; external kernel32 name 'GetVolumeNameForVolumeMountPointA'; function SetVolumeMountPoint(lpszVolumeMountPoint: LPSTR; lpszVolumeName: LPSTR): Bool; stdcall; external kernel32 name 'SetVolumeMountPointA'; function DeleteVolumeMountPoint(lpszVolumeMountPoint: LPSTR): Bool; stdcall; external kernel32 name 'DeleteVolumeMountPointA'; var Vol, Point: array [0..1023] of AnsiChar; VH, PH: THandle; Ck:Bool; begin // Что мантируем Ck:=GetVolumeNameForVolumeMountPoint('H:\', Vol, SizeOf(Vol)); if not Ck then begin WriteLn('No volumes found!'); Exit; end; // Куда мантируем Ck:=SetVolumeMountPoint('F:\DiskH\', Vol); if not Ck then begin WriteLn('Cannot mount!'); end; VH := FindFirstVolume(Vol, SizeOf(Vol)); if VH = INVALID_HANDLE_VALUE then begin WriteLn('No volumes found!'); Exit; end; repeat WriteLn(Vol); PH := FindFirstVolumeMountPoint(Vol, Point, SizeOf(Point)); if PH = INVALID_HANDLE_VALUE then WriteLn(' No mounted folders.') else begin repeat WriteLn(' ', Point); until not FindNextVolumeMountPoint(PH, Point, SizeOf(Point)); FindVolumeMountPointClose(PH); end; WriteLn; until not FindNextVolume(VH, Vol, SizeOf(Vol)); FindVolumeClose(VH); ck:=DeleteVolumeMountPoint('F:\DiskH\'); if not Ck then begin WriteLn('Cannot unmount!'); Exit; end; ReadLn; end. |
Сообщ.
#3
,
|
|
|
Если речь о папках, смотнированных на том, то я специально монтировал папки, их всё равно не видно через эту функцию
Добавлено Да, я нашёл "They do not return drive letters or volume GUID paths". И я разобрался почему не видно было папки. Оказывается, эти Find'ы работают только от имени администратора, от юзера ничего не показывают. А вот GetVolumePathNamesForVolumeName работают и от юзера (и диски тоже показывают), и от админа. Бред какой-то... |