Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.02;
Скачать: CL | DM;

Вниз

USB Flash   Найти похожие ветки 

 
андр   (2007-12-17 11:24) [0]

Ребят помогите пожалуйсто с написанием программы которая бы при подключении Карты памяти Flash, брала ее имя и серийный номер и писала в лог файл....


 
clickmaker ©   (2007-12-17 13:07) [1]

WM_DEVICECHANGE
GetVolumeInformation()


 
андр   (2007-12-17 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.



Сории за тупость.. Непойму, и что дальше ?.... Что эта вункция делает, есть ли ее описание, какие промежуточные переменные ей необходимы ?


 
андр   (2007-12-17 15:34) [3]

Есть ли готовые самые простые примеры, чтоб хотябы только букву съемного диска возвращала.?????


 
Kolan ©   (2007-12-17 15:35) [4]

Толь-ко вот была сабжевая ветка — ищи.


 
clickmaker ©   (2007-12-17 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   (2007-12-21 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 ©   (2007-12-25 14:11) [7]

to Enjoy

Можно описание данной функции-GetDiskSizeAvail


 
Enjoy   (2008-01-05 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 ©   (2008-01-05 17:47) [9]


> GetVolumeInformation

возвращает информацию о ЛОГИЧЕСКОМ диске.
а не о физическом серийном номере флешки.



Страницы: 1 вся ветка

Текущий архив: 2008.11.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
4-1198918810
Winni
2007-12-29 12:00
2008.11.02
FindNextFile


15-1218713094
@!!ex
2008-08-14 15:24
2008.11.02
Хочу купить монитор


1-1201255928
salexn
2008-01-25 13:12
2008.11.02
Анализ подключенных модулей


11-1194956757
tigra
2007-11-13 15:25
2008.11.02
вкладки


2-1222254838
@!!ex
2008-09-24 15:13
2008.11.02
Не получается правильно поставить Hook на нажатие клавиши...