Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Free Pascal, Pascal ABC и другие _ Как вывести метку диска?

Автор: Билли Боб 23.08.2011 22:36

На TP вот так работает:


var s: searchrec;
findfirst ('c:\*.*',VolumeID,s);
if doserror=0 then writeln(s.name);



на фри сделал так:


var s: tsearchrec;
if findfirst ('c:\*.*',faVolumeID,s)=0 then writeln(s.name);
findclose(s);



не работает.
Как надо?

Автор: IUnknown 23.08.2011 23:17

Цитата
не работает.
Не надо так категорично. Работает, но не везде: под чистым ДОС-ом (при использовании GO32v2) этот код прекрасно покажет метку диска. Во всех остальных случаях - нет. Проблема в том, что получение метки диска - операция некроссплатформенная, и для ее выполнения необходимо использовать API твоей системы. Работаешь под Windows - значит, GetVolumeInformation. А эту константу faVolumeID уже давно пора объявить deprecated, http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_faVolumeID.html

Автор: Билли Боб 24.08.2011 0:21

а GetVolumeInformation под ДОСом будет работать?

Автор: IUnknown 24.08.2011 0:55

Цитата
GetVolumeInformation под ДОСом будет работать?
Нет, конечно. Если нужно и там и там (и Win32 и DOS) - то можно воспользоваться условной компиляцией (если программа будет перекомпилироваться на целевой платформе, разумеется) :

{$IF Defined(WIN32)}
// тут блок кода с использованием GetVolumeInformation
{$ELSEIF Defined(GO32V2)}
// тут - досовский вариант, с использованием faVolumeID
{$ELSE}
// тут можно добавить поддержку других ОСей
{$ENDIF}

Автор: Билли Боб 24.08.2011 1:17

Можешь написать пример использования GetVolumeInformation?
Что-то я попробовал, все равно не выводит метку.

Автор: IUnknown 24.08.2011 1:25

Ну, например, вот так:

function GetVolumeLabel(const DriveLetter: Char): string;
var
VolumeName: array [0 .. MAX_PATH - 1] of Char;
VolumeSerialNo : DWORD;
MaxComponentLength, FileSystemFlags : Cardinal;
begin
GetVolumeInformation(PChar(DriveLetter + ':\'),
VolumeName, MAX_PATH, nil,
MaxComponentLength, FileSystemFlags, nil, MAX_PATH);
GetVolumeLabel := VolumeName;
end;

// Вызывать:
writeln (GetVolumeLabel ('С'));

Проверить не могу, по причине отсутствия Windows, тестируй, если что не так - говори...

Автор: Билли Боб 24.08.2011 1:55

PChar(DriveLetter + ':\')

Illegal type conversion: ShortString to ^PChar

GetVolumeLabel := VolumeName;

Incompatible types: got "array [0..259] of Char" expected "ShortString"


Автор: IUnknown 24.08.2011 2:20

{$H+}
первой строкой программы, или Options -> Compiler -> Syntax -> включить Use AnsiStrings. Если этот режим отключен - то String трактуется как ShortString, что приводит к ошибкам...

Автор: Билли Боб 24.08.2011 2:57

ооотлично! работает!