Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с дисками! [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо