Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.11.02;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.11.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
15-1220620461
Плохиш
2008-09-05 17:14
2008.11.02
Поздравляю всех с началом нового учебного года!


1-1202194972
Dmitriy
2008-02-05 10:02
2008.11.02
Вызов C# DLL из Delphi


2-1222147865
vegarulez
2008-09-23 09:31
2008.11.02
Вопрос про хук.


1-1202119964
МистерТ
2008-02-04 13:12
2008.11.02
Как в Delphi10Lite переключить ключ компиляции ?


15-1220940925
Ламо777
2008-09-09 10:15
2008.11.02
3D в вебе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский