Форум: "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