Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как поставить машинный адрес в соответствие букве?


Автор: EnyKey 14.10.2006, 23:41
Программа получает адрес в виде \Device\HarddiskVolume3\...
Для дальнейшего обращения к файлу нужно преобразовать данное представление в, например, E:\...

Как такое сделать?

Автор: anwe 15.10.2006, 00:36
Откуда получается адрес без имени диска?
Если тебе нужен полный адрес к файлу то используй функцию GetCurrentDir.

Автор: EnyKey 15.10.2006, 00:47
Получаем от NtQueryObject... 
Вместо имени диска идёт машинное представление MountedDevice. Надо полчучить имя диска

Автор: bems 15.10.2006, 03:49
Код

program Project1;

{$APPTYPE CONSOLE}

uses
  windows;

var buf:PChar;

begin
  GetMem(buf,1024);
  QueryDosDevice('c:',buf,1024);
  writeln(buf);
  FreeMem(buf,1024);
  readln
end.

Эта штука выводит 
Код

\Device\HarddiskVolume1 

Перебираешь все буквы и сравниваешь со своим девайсом

Автор: BUGOR 15.10.2006, 07:56
Ну вообще эта информация хранится здесь: HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices, а ещё есть функция DefineDosDevice, она вроде обратна функции QueryDosDevice, иль я ошибаюсь)

Автор: S0vNarK0m 15.10.2006, 14:24
BUGOR,  Ошибаешься, DefineDosDevice позволяет смонтировать диск... или отключить. smile 

Автор: BUGOR 15.10.2006, 14:29
S0vNarK0m, вот, единственный раз пренебрёг описанием и решил положиться на свою логику и ошибься, бывает... спасибо за поправкуsmile

Автор: EnyKey 15.10.2006, 14:34
bems, а без перебора способа нету?

Автор: bems 16.10.2006, 01:47
Цитата(EnyKey @  15.10.2006,  14:34 Найти цитируемый пост)
 а без перебора способа нету? 

Мне такие не известны, но не думаю чтобы они были. Дело в том, что c: это символическая ссылка на Device\HarddiskVolume1 и их может быть больше одной. 
Как зная (к примеру) адрес ячейки памяти найти конкретный из всего множества указатель на нее? Это метафора, но я надеюсь мысль ясна - с помощью DefineDosDevice можно хоть десяток "дисков"-двойников наделать, хватило бы букв. Поэтому если способы, о которых ты говоришь и существуют, то внутренне это будет перебор.

Если и после этого способ не подходит - вся проблема в реализации и нужно учиться писать  smile 

Автор: dumb 16.10.2006, 02:05
Цитата(EnyKey @  15.10.2006,  14:34 Найти цитируемый пост)
bems, а без перебора способа нету? 

если microsoft http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/obtaining_a_file_name_from_a_file_handle.asp, то, видимо, и тебе придется. smile

Автор: EnyKey 16.10.2006, 21:53
bems, нет, спасибо, просто думал, вдруг варианты есть))

Автор: bems 17.10.2006, 02:22
EnyKey, почитай еще хелп по QueryDosDevice, она может возвращать не строку, а массив строк. Пример савсем упращенный

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)