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


Автор: olbolab 7.7.2007, 16:08
Пересмотрел все сообщения такого плана на форуме, вразумительного ответа нет, не можно примерчик програмки для разбора!!!!! smile 

Автор: lukas 7.7.2007, 18:00
вот с помощью командной строки

Код

procedure VirtualCD(X:Char; Path:String);
begin

WinExec('Subst ' + X +': "'+Path+'"', SW_HIDE);

end;

Автор: lukas 8.7.2007, 20:50
удалить кстати созданный виртуальный диск очень просто...

WinExec('Subst ' + X +':  /d', SW_HIDE);

Автор: MadCoder 30.1.2008, 23:33
А как можно отличить виртуальный диск от обычного, когда список дисков получаешь?

Автор: Addmin 1.3.2008, 20:15
Никак. Для системы он такой же диск, как и все остальные.

Автор: MadCoder 1.3.2008, 20:45
Цитата(Addmin @ 1.3.2008,  20:15)
Никак. Для системы он такой же диск, как и все остальные.

Не согласен с Вами, товарищ Аддмин.

Вот рабочий код, определящий только существующие жесткие диски, исключая виртуальные:
Код

// Определяет список разделов жестких дисков
function ListDrives: Tstringlist;
const
  NameSize    = 4;
  VolumeCount = 26;
  TotalSize   = NameSize * VolumeCount;
var
  Buff, Volume: String;
  lpQuery: array [0..MAXCHAR - 1] of Char;
  I, Count: Integer;
begin
Result:=Tstringlist.Create;

SetLength(Buff, TotalSize);
Count := GetLogicalDriveStrings(TotalSize, @Buff[1]) div NameSize;
if Count = 0 then
exit
  else
    for i := 0 to Count - 1 do
    begin
      Volume := PChar(@Buff[(I * NameSize) + 1]);
      if GetDriveType(PChar(Volume))=DRIVE_FIXED then
          begin
            Volume[3] := #0;
            QueryDosDevice(PChar(Volume), @lpQuery[0], MAXCHAR);
            Volume[3] := '\';
            if Copy(String(lpQuery), 1, 22)  = '\Device\HarddiskVolume' then
            Result.Add(Volume)
          end;

          end;
end;

Код рабочий, применяю в одном из своих проектов. Конкретно определение виртуальный диск или нет определяется так:
Код

 if Copy(String(lpQuery), 1, 22)  = '\Device\HarddiskVolume' then

Автор: Qu1nt 2.3.2008, 00:58
Код

procedure TForm1.Button1Click(Sender: TObject);
const
  NameSize    = 4;
  VolumeCount = 26;
  TotalSize   = NameSize * VolumeCount;
  Report      = 'Volume: %s %s';
var
  Buff, Volume  : string;
  lpQuery       : array [0..MAXCHAR - 1] of Char;
  I, Count      : Integer;
begin
  SetLength(Buff, TotalSize);
  Count := GetLogicalDriveStrings(TotalSize, @Buff[1]) div NameSize;
  if Count = 0 then
    Memo1.Lines.Add(SysErrorMessage(GetLastError))
  else
    for i := 0 to Count - 1 do
    begin
      Volume := PChar(@Buff[(I * NameSize) + 1]);
      case GetDriveType(PChar(Volume)) of
        DRIVE_UNKNOWN: Memo1.Lines.Add(Format(Report, [Volume,
          'The drive type cannot be determined.']));
        DRIVE_NO_ROOT_DIR: Memo1.Lines.Add(Format(Report, [Volume,
          'The root path is invalid. For example, no volume is mounted at the path.']));
        DRIVE_REMOVABLE:
          begin
            Volume[3] := #0;
            QueryDosDevice(PChar(Volume), @lpQuery[0], MAXCHAR);
            Volume[3] := '\';
            if String(lpQuery) = '\Device\Floppy0' then
              Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a Floppy disk A:.']))
            else
              if String(lpQuery) = '\Device\Floppy1' then
                Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a Floppy disk B:.']))
              else
                Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a Flash Drive.']));
          end;
        DRIVE_FIXED:
          begin
            Volume[3] := #0;
            QueryDosDevice(PChar(Volume), @lpQuery[0], MAXCHAR);
            Volume[3] := '\';
            if Copy(String(lpQuery), 1, 22)  = '\Device\HarddiskVolume' then
              Memo1.Lines.Add(Format(Report, [Volume, 'The disk cannot be removed from the drive.']))
            else
              Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a SUBST disk on path: "' +
                Copy(String(lpQuery), 5, Length(String(lpQuery))) + '"']));
          end;
        DRIVE_REMOTE: Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a remote (network) drive.']));
        DRIVE_CDROM: Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a CD-ROM drive.']));
        DRIVE_RAMDISK: Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a RAM disk.']));
    else
      Memo1.Lines.Add(Format(Report, [Volume, 'Xpen znaet chto :)']));
    end;
  end;
end;

DRKB.

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