IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Как вывести метку диска?
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


На 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);



не работает.
Как надо?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Разработчик
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
не работает.
Не надо так категорично. Работает, но не везде: под чистым ДОС-ом (при использовании GO32v2) этот код прекрасно покажет метку диска. Во всех остальных случаях - нет. Проблема в том, что получение метки диска - операция некроссплатформенная, и для ее выполнения необходимо использовать API твоей системы. Работаешь под Windows - значит, GetVolumeInformation. А эту константу faVolumeID уже давно пора объявить deprecated, как сделали в Дельфи
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


а GetVolumeInformation под ДОСом будет работать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Разработчик
Free Pascal: Разработчик

Репутация: -  627  +


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

{$IF Defined(WIN32)}
// тут блок кода с использованием GetVolumeInformation
{$ELSEIF Defined(GO32V2)}
// тут - досовский вариант, с использованием faVolumeID
{$ELSE}
// тут можно добавить поддержку других ОСей
{$ENDIF}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Можешь написать пример использования GetVolumeInformation?
Что-то я попробовал, все равно не выводит метку.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Разработчик
Free Pascal: Разработчик

Репутация: -  627  +


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

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, тестируй, если что не так - говори...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


PChar(DriveLetter + ':\')

Illegal type conversion: ShortString to ^PChar

GetVolumeLabel := VolumeName;

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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Разработчик
Free Pascal: Разработчик

Репутация: -  627  +


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


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


ооотлично! работает!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 19.01.2018 18:13
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"