![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с дисками! [D7, Win95/98, WinXP]
Александр1 © (2004-08-17 19:47:00)Здравствуйте уважаемые мастера!
Вот алгоритм для определения информации о диске. А в частности определения серийного номера диска:
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
SerialNum : pdword;
a, b : Cardinal;
Buffer : array [0..MAX_PATH-1] of char;
begin
new(SerialNum);
if GetVolumeInformation(‘C:\’, Buffer, SizeOf(Buffer), SerialNum, a, b, nil, 0) then
Label1.Caption:= IntToStr(SerialNum^);
dispose(SerialNum);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
VolumeName,
FileSystemName : array [0..MAX_PATH-1] of Char;
MaxComponentLength, FileSystemFlags : Cardinal;
VolumeSerialNo : DWord;
begin
if GetVolumeInformation(‘C:\’,VolumeName,MAX_PATH,@VolumeSerialNo,
MaxComponentLength,FileSystemFlags,
FileSystemName,MAX_PATH) then
begin
Memo1.Lines.Add('VName = '+VolumeName);
Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8));
Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength));
Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4));
Memo1.Lines.Add('FSName = '+FileSystemName);
end;
end;
end.
ДАННЫЙ ПРИМЕР РАБОТАЕТ!
Но в данном примере необходимо тип диска указывать ‘С:\’, А если сделать так:
var
Form1: TForm1;
h:string;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
SerialNum : pdword;
a, b : Cardinal;
Buffer : array [0..MAX_PATH-1] of char;
begin
h:='C:\';
new(SerialNum);
if GetVolumeInformation(h, Buffer, SizeOf(Buffer), SerialNum, a, b, nil, 0) then
Label1.Caption:= IntToStr(SerialNum^);
dispose(SerialNum);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
VolumeName,
FileSystemName : array [0..MAX_PATH-1] of Char;
MaxComponentLength, FileSystemFlags : Cardinal;
VolumeSerialNo : DWord;
begin
if GetVolumeInformation(h,VolumeName,MAX_PATH,@VolumeSerialNo,
MaxComponentLength,FileSystemFlags,
FileSystemName,MAX_PATH) then
begin
Memo1.Lines.Add('VName = '+VolumeName);
Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8));
Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength));
Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4));
Memo1.Lines.Add('FSName = '+FileSystemName);
end;
end;
end.
Где h – string. ЭТОТ ПРИМЕР НЕ РАБОТАЕТ, ХОТЯ ЕГО СУТЬ ОСТАЛАСЬ ТОЙЖЕ.
Помогите пожалуйста сделать так чтобы второй вариант программы работал!
Заранее спасибо за помощь!
Александр1 (2004-08-27 14:47:00) [1]
> http://ln.com.ua/~openxs/articles/smart-questions-ru.html
>
> Читай.
Да это понятно. Но иногда чтобы добиться результата к большому сожелению приходится, сам того не ведая, "грешить", отступать от правил. Да к сожалению это так. Но по мере возможного я стараюсь придерживаться правил. Хотя если говорить честно, то у вас здесь пол сайта (50%) нарушают эти правила. Ну и чё??? Убить что-ли всех..... Или может быть распять на кресте.....
Игорь Шевченко (2004-08-25 17:32:00) [2]
> Знаешь я пришёл на этот сайт не деньги платить, а опыта
> набираться. А деньги я и так за интернет плачу!
http://ln.com.ua/~openxs/articles/smart-questions-ru.html
Читай.
Александр1 (2004-08-25 14:13:00) [3]Vit@ly - Большое спасибо!
Александр1 (2004-08-25 14:12:00) [4]Игорь Шевченко Знаешь я пришёл на этот сайт не деньги платить, а опыта набираться. А деньги я и так за интернет плачу!
Vit@ly (2004-08-24 18:23:00) [5]Странно, что тебя не удовлетворил Alex Konshin ©
http://www.swissdelphicenter.ch/en/showcode.php?id=57
Попытай счастья здесь
:(
Игорь Шевченко (2004-08-24 18:18:00) [6]
> У меня правда мало опыта в этом деле.
Тогда у тебя должно быть много денег, чтобы заплатить за готовую программу тому, у кого опыта больше.
Александр1 (2004-08-24 18:03:00) [7]Удалено модератором
Примечание: Создание пустых сообщений
Александр1 (2004-08-20 19:31:00) [8]Да это понятно. У меня правда мало опыта в этом деле. Ну ни чё попробуем разобраться.
Может у кого ещё будут какие примеры?
Alex Konshin (2004-08-20 11:11:00) [9]Надо - напиши. Там все для этого есть.
Александр1 (2004-08-20 08:16:00) [10]Alex Konshin - Спасибо за интересную информацию.
Но все эти приложения без формы. А мне надо с формой, с кнопками?
Alex Konshin (2004-08-20 06:23:00) [11]http://home.earthlink.net/~akonshin/index.htm
Александр1 (2004-08-19 17:58:00) [12]Спасибо на род за помощь, а то я давно уже мучился с этим серийными номерами.
К стати код:
var
SerialNum : DWORD;
...
begin
h:='C:\';
if GetVolumeInformation(pchar(h), Buffer, SizeOf(Buffer), @SerialNum, a, b, nil, 0) then
Label1.Caption:= IntToStr(SerialNum);
Даёт как я понял номер тома, а не диска. Т.к. у меня один винчестер, но он разбит Fdisk-ом на две чести (С и D). При проверки номера прога показывает разные. Но диск та один.
Серийный номер диска в данном случае можно узнать или нет?
И как на счёт procedure TForm1.Button2Click(Sender: TObject); ………
Burmistroff (2004-08-18 00:03:00) [13]тогда уж заменить на:
var
SerialNum : DWORD;
...
begin
h:='C:\';
if GetVolumeInformation(pchar(h), Buffer, SizeOf(Buffer), @SerialNum, a, b, nil, 0) then
Label1.Caption:= IntToStr(SerialNum);
По поводу темы -- серийные номера томов (как правильно заметил Alex Konshin) меняются просто и часто, опасно к ним привязываться!
Alex Konshin (2004-08-17 23:28:00) [14]Опять двадцать пять.
Это получение информации и серийного номера тома, а не диска.
8ung (2004-08-17 23:26:00) [15]function GetVolumeInformation ( lpRootPathName: PChar; lpVolumeNameBuffer: PChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD;
var lpMaximumComponentLength, lpFileSystemFlags: DWORD;
lpFileSystemNameBuffer: PChar; nFileSystemNameSize: DWORD): BOOL;
Т.к. h - string, а lpRootPathName - Pchar, то нужно h преобразовать в pchar, т.е. писать pchar(h)...
Fay (2004-08-17 20:42:00) [16]М.б. не в тему, но извращение
var
SerialNum : pdword;
...
begin
new(SerialNum);
if GetVolumeInformation(h, Buffer, SizeOf(Buffer), SerialNum, a, b, nil, 0) then
Label1.Caption:= IntToStr(SerialNum^);
dispose(SerialNum);
можно заменить на
var
SerialNum : pdword;
...
begin
if GetVolumeInformation(h, Buffer, SizeOf(Buffer), @SerialNum, a, b, nil, 0) then
Label1.Caption:= IntToStr(SerialNum^);
xman (2004-08-17 20:36:00) [17]я делал так
(pchar(DriveComboBox1.drive+':\'),....)
или просто pchar(h)
смотря что там в H
xman (2004-08-17 20:36:00) [18]я делал так
(pchar(DriveComboBox1.drive+':\'),....)
или просто pchar(h)
смотря что там в H