-
Ребят помогите пожалуйсто с написанием программы которая бы при подключении Карты памяти Flash, брала ее имя и серийный номер и писала в лог файл....
-
WM_DEVICECHANGE GetVolumeInformation()
-
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
private
public
procedure MSG(var M: TMessage); message WM_DEVICECHANGE;
end;
var
Form1: TForm1;
implementation
procedure TForm1.MSG(var M: TMessage);
begin
GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber,
lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize)
end;
end.
Сории за тупость.. Непойму, и что дальше ?.... Что эта вункция делает, есть ли ее описание, какие промежуточные переменные ей необходимы ?
-
Есть ли готовые самые простые примеры, чтоб хотябы только букву съемного диска возвращала.?????
-
Толь-ко вот была сабжевая ветка ищи.
-
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;
-
Вот кажется все с исчерпывающими комментами. Мне нужно было все оформить по-блондински, так что может показатьсяслишком сложно, но эт. только иллюзия :) Если использовать шрифт 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;
-
to Enjoy
Можно описание данной функции-GetDiskSizeAvail
-
Ок. Я про нее и забыл. Procedure GetDiskSizeAvail(TheDrive:PChar;
var TotalBytes, TotalFree,
AvailToCaller:double);
var
AvailToCall,TheSize,FreeAvail:int64;
begin
GetDiskFreeSpaceEx(TheDrive,
AvailToCall,
TheSize,
@FreeAvail);
AvailToCaller:=FreeAvail;
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 , вот и свободное пространство.
-
> GetVolumeInformation
возвращает информацию о ЛОГИЧЕСКОМ диске. а не о физическом серийном номере флешки.
|