Конференция "WinAPI" » USB Flash [D7, WinXP]
 
  • андр (17.12.07 11:24) [0]
    Ребят помогите пожалуйсто с написанием программы которая бы при подключении Карты памяти Flash, брала ее имя и серийный номер и писала в лог файл....
  • clickmaker © (17.12.07 13:07) [1]
    WM_DEVICECHANGE
    GetVolumeInformation()
  • андр (17.12.07 15:32) [2]

    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls;

    type
     TForm1 = class(TForm)
       Label1: TLabel;
     private
       { Private declarations }
     public
       { Public declarations }
       procedure MSG(var M: TMessage); message WM_DEVICECHANGE;
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.MSG(var M: TMessage);
    begin
     GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber,
                          lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize)
    end;

    end.




    Сории за тупость.. Непойму, и что дальше ?.... Что эта вункция делает, есть ли ее описание, какие промежуточные переменные ей необходимы ?
  • андр (17.12.07 15:34) [3]
    Есть ли готовые самые простые примеры, чтоб хотябы только букву съемного диска возвращала.?????
  • Kolan © (17.12.07 15:35) [4]
    Толь-ко вот была сабжевая ветка — ищи.
  • clickmaker © (17.12.07 16:16) [5]
    procedure TForm1.MSG(var M: TMessage);
    var
      hdr: DEV_BROADCAST_HDR^;
      vol: DEV_BROADCAST_VOLUME^;
    begin
     if (M.wParam = DBT_DEVICEARRIVAL) then
     begin
        hdr := lParam;
        if (hdr.dbch_devicetype = DBT_DEVTYP_VOLUME) then begin

          vol := lParam;
          // дальше сам разбирайся
       end;
    end;
  • Enjoy (21.12.07 00:03) [6]
    Вот кажется все с исчерпывающими комментами.
    Мне нужно было все оформить по-блондински, так что может показатьсяслишком сложно, но эт. только иллюзия :)
    Если использовать шрифт Courier New и параметр Align - true, то все замечательно выравняет.

    //Функция вывода текстового вида флага в заданной величине
    Function HasFlag(Value,Flag:DWord):string;
    begin
     if (Value and Flag)=Flag then
       Result:='Да'
     else
       Result:='Нет';
    end;

    //Функция расширения строки ведущими пробелами для выравнивания
    Function AddSpaces(s:string; targlen:word):string;
    var i:word;
    begin
     for i:=length(s) to targlen do
       s:=' '+s;
     Result:=s;
    end;

    //Полная информация об одном разделе
    Function GetDiskInfo(Disk:Char; Align:boolean):string;
    var
     VolumeName,FSName:array [0..MAX_PATH-1] of Char;
     VolumeSerialNo,MaxComponentLength,FSFlags:LongWord;
     SOut:string;
     TSize,TFree,TAvail:double;
     SectorsPerClst,BytesPerSctr,FreeClstrs,TotalClstrs:dword;
     al1,al2,Align1,Align2,Align3,Align4:word;
    begin
    //Параметры, используемые для выравнивания
     if Align then
       begin
         Align1:=17; Align2:=37; Align3:=20; Align4:=14;
       end
     else
       begin
         Align1:=0;  Align2:=0;  Align3:=0;  Align4:=0;
       end;
     SOut:='Диск: '+Disk+#13+#10+DriveError;
     if GetVolumeInformation(PChar(Disk+':\'),
                             VolumeName,MAX_PATH,
                             @VolumeSerialNo, MaxComponentLength,
                             FSFlags,FSName,MAX_PATH)
     then
       begin
    //Получение информации о свободном и занятом пространстве на диске
         GetDiskSizeAvail(PChar(Disk+':\'),TSize,TFree,TAvail);
         GetDiskFreeSpace(PChar(Disk+':\'),SectorsPerClst,BytesPerSctr,
                          FreeClstrs,TotalClstrs);
    //Параметры выравнивания чисел
         if Align then
           begin
             al1:=length(floattostrF(TotalClstrs,ffNumber,12,0))-1;
             al2:=length(floattostrF(TSize,ffNumber,12,0))-1;
           end
         else
           begin
             al1:=0;
             al2:=0;
           end;
    //Информация о разделе
         SOut:=
         'Диск: '+Disk+#13#10+
         AddSpaces('Метка: ',Align1)+VolumeName+#13#10+
         AddSpaces('Файловая система: ',Align1)+FSName+#13+#10+
         AddSpaces('Серийный номер: ',Align1)+IntToHex(VolumeSerialNo,8)+#13+#10+
         #13#10+
         'Макс. длина имени файла: '+IntToStr(MaxComponentLength)+#13+#10+
         #13#10+
    //Информация о флагах файловой системы
         'Флаги файловой системы: '+IntToHex(FSFlags,4)+#13#10+
         AddSpaces('Сохранение регистра в именах файлов: ',Align2)+
           HasFlag(FSFlags,FS_CASE_IS_PRESERVED)+#13#10+
         AddSpaces('Имена файлов чувстительны к регистру: ',Align2)+
           HasFlag(FSFlags,FS_CASE_SENSITIVE)+#13#10+
         AddSpaces('Поддержка Unicode в именах файлов: ',Align2)+
           HasFlag(FSFlags,FS_UNICODE_STORED_ON_DISK)+#13#10+
         AddSpaces('Поддержка списка контроля доступа: ',Align2)+
           HasFlag(FSFlags,FS_PERSISTENT_ACLS)+#13#10+
         AddSpaces('Поддержка сжатия файлов: ',Align2)+
           HasFlag(FSFlags,FS_FILE_COMPRESSION)+#13#10+
         AddSpaces('Указаный том является сжатым: ',Align2)+
           HasFlag(FSFlags,FS_VOL_IS_COMPRESSED)+#13#10+
         #13#10+
    //Информация о пространстве раздела
         AddSpaces('Байт в секторе: ',Align3)+floattostrF(BytesPerSctr,ffNumber,12,0)+#13#10+
         AddSpaces('Секторов в кластере: ',Align3)+floattostrF(SectorsPerClst,ffNumber,12,0)+#13#10+
         AddSpaces('Байт в кластере: ',Align3)+floattostrF(BytesPerSctr*SectorsPerClst,ffNumber,12,0)+#13#10+
         AddSpaces('Всего кластеров: ',Align3)+AddSpaces(floattostrF(TotalClstrs,ffNumber,12,0),al1)+#13#10+
         AddSpaces('Свободно кластеров: ',Align3)+AddSpaces(floattostrF(FreeClstrs,ffNumber,12,0),al1)+#13#10+
         #13#10+
         AddSpaces('Емкость байт: ',Align4)+AddSpaces(floattostrF(TSize,ffNumber,12,0),al2)+#13#10+
         AddSpaces('Свободно байт: ',Align4)+AddSpaces(floattostrF(TFree,ffNumber,12,0),al2)+#13#10+
         AddSpaces('Доступно байт: ',Align4)+AddSpaces(floattostrF(TAvail,ffNumber,12,0),al2);
       end;
     Result:=SOut;
    end;

  • koss © (25.12.07 14:11) [7]
    to Enjoy

    Можно описание данной функции-GetDiskSizeAvail
  • Enjoy (05.01.08 17:35) [8]
    Ок. Я про нее и забыл.

    //Определение свободного и занятого пространства на диске
    Procedure GetDiskSizeAvail(TheDrive:PChar;
                              var TotalBytes, TotalFree,
                              AvailToCaller:double);
    var
     AvailToCall,TheSize,FreeAvail:int64;
    begin
     GetDiskFreeSpaceEx(TheDrive,
                        AvailToCall,
                        TheSize,
                        @FreeAvail);
     AvailToCaller:=FreeAvail;
    {$IFOPT Q+}
    {$DEFINE TURNOVERFLOWON}
    {$Q-}
    {$ENDIF}
     if TheSize >= 0 then
       TotalBytes := TheSize
     else
       if TheSize = -1 then
         begin
           TotalBytes := $7FFFFFFF;
           TotalBytes := TotalBytes * 2;
           TotalBytes := TotalBytes + 1;
         end
       else
         begin
           TotalBytes := $7FFFFFFF;
           TotalBytes := TotalBytes + abs($7FFFFFFF - TheSize);
         end;
     if AvailToCall>=0 then
       TotalFree:=AvailToCall
     else
       if AvailToCall=-1 then
         begin
           TotalFree := $7FFFFFFF;
           TotalFree := TotalFree * 2;
           TotalFree := TotalFree + 1;
         end
       else
         begin
           TotalFree := $7FFFFFFF;
           TotalFree := TotalFree + abs($7FFFFFFF - AvailToCall);
         end;
    end;



    Вся эта математика после вызова GetDiskFreeSpaceEx нужна чтобы правильно возвращать данные для винтов больше какого-то объема. Точно не помню, кажется или 2 или 4 гектара. В принципе весь смысл от данной функции, что она работает с квотами.
    Т.е.
    AvailToCaller

    - доступное текущему пользователю пространство, если на винте NTFS. На флехе скорее всего это не нужно, так что можно умножать число свободных кластеров
    FreeClstrs

    на число байт в одном кластере
    BytesPerSctr*SectorsPerClst

    , вот и свободное пространство.
  • MetalFan © (05.01.08 17:47) [9]

    > GetVolumeInformation

    возвращает информацию о ЛОГИЧЕСКОМ диске.
    а не о физическом серийном номере флешки.
 
Конференция "WinAPI" » USB Flash [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.005]