Аналог mmsystem для Linux.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Аналог mmsystem для Linux.

Сообщение BadBoyAlex »

Здравствуйте, уважаемые форумчане!
Хочу портировать свой проект и на Линукс тоже. Загвоздка в том, что мой проект использует модуль mmsystem, которого в Лине нет. Использует он его для получения информации о диске и извлечении CD-диска:

Код: Выделить всё

function GetVolumeInfo (const ADisc: WideChar): TDiscInfo;
var root: PChar;
    res: LongBool;
    VolumeNameBuffer, FileSystemNameBuffer: PChar;
    VolumeNameSize,FileSystemNameSize: DWORD;
    VolumeSerialNumber, MaximumComponentLength, FileSystemFlags: DWORD;
    s: String;
begin
s:= ADisc + ':\';
root:= PChar(s);
GetMem(VolumeNameBuffer, 256);
Getmem(FileSystemNameBuffer, 256);
VolumeNameSize:= 255;
FileSystemNameSize:= 255;
res:= GetVolumeInformation(Root, VolumeNameBuffer, VolumeNameSize, @VolumeSerialNumber, MaximumComponentLength, FileSystemFlags, FileSystemNameBuffer, FileSystemNameSize);
with Result do
 begin
 diHasInfo:= res;
 diDrive:= ADisc;
 diVolumeName:= VolumeNameBuffer;
 diFileSystem:= FileSystemNameBuffer;
 diSerial:= VolumeSerialNumber;
 end;
Freemem(VolumeNameBuffer, 256);
Freemem(FileSystemNameBuffer, 256);
end;
function EjectCD (const ADisc: WideChar): Boolean;
var Res: MciError;
    OpenParm: TMCI_Open_Parms;
    Flags: DWord;
    S: String;
    DeviceID: Word;
begin
Result:= False;
if ADisc = '' then
 Abort;
S:= ADisc + ':';
if GetDriveType(PChar(S)) = DRIVE_CDROM then
 begin
 Flags:= mci_Open_Type or mci_Open_Element;
 with OpenParm do
  begin
  dwCallback:= 0;
  lpstrDeviceType:= 'CDAudio';
  lpstrElementName:= PChar(S);
  end;
 Res:= mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm));
 if Res <> 0 then
  Exit;
 DeviceID:= OpenParm.wDeviceID;
 try
  Res:= mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
  if Res = 0 then
   Exit;
  Result:= True;
 finally
  mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
  end;
 end;
end;

Есть ли другие варианты, для которых бы указанный код (или код, который будет аналогичен (или лучше) по функционалу) работал?
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

eject -h

Или посмотрите тут. Там, вроде как есть работа с СД.
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

pupsik писал(а):eject -h

Или посмотрите тут. Там, вроде как есть работа с СД.


Просто нужно реализовать не только извлечение/загрузку диска, но и получение информации о нём.
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

Bass ? Там есть все :)
http://un4seen.com
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

Little_Roo писал(а):Bass ? Там есть все :)
http://un4seen.com


А есть ли возможность получить информацию о диске, извлечь его без подключения сторонних библиотек?
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Код: Выделить всё

cat /proc/sys/dev/cdrom/info


есть пакет
https://ru.wikipedia.org/wiki/Cdrtools
cdrecord -prcap

а что конкретно нужно получить?
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

...но и получение информации о нём.
а вы смотрели ссылку? Там, как бы, инфу извлечь можно. И, вроде как, работают через системные либы.
...извлечь его без подключения сторонних библиотек?
есть. Читайте маны...
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

olegy123 писал(а):а что конкретно нужно получить?

Нужно получить список дисков, получить название вставленного диска, файловую систему, (опционально) серийный номер, размер и потом извлечь его.

pupsik писал(а):а вы смотрели ссылку? Там, как бы, инфу извлечь можно. И, вроде как, работают через системные либы.

Смотрел. AV выдаёт при подключении пакета. Там только под Win32, но у меня Win32/64, Lin...
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

Нужно получить список дисков, получить название вставленного диска...
сорцы DC...

..Там только под Win32, но у меня Win32/64, Lin
первоначальный вопрос был о лине. И я не писал о установке. Я советовал посмотреть какая реализация для лина.
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

А посмотреть в самом FPC?
Давно всё там есть. Кросплатформено.
fpcsrc/packages/cdrom
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Через консоль
cdrecord(форк wodim) от инфы по -devices до записи/копирования/извлечения.

если stdio стремно, и умеете линковать сишные либлы, то есть возможность поработать через
https://dev.lovelyhq.com/libburnia/web/wikis/home

Добавлено спустя 16 минут 34 секунды:
http://manual.aptosid.com/ru/cd-no-gui-burn-ru.htm
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

Новая проблема:

Код: Выделить всё

Hint: (11030) Start of reading config file /etc/fpc.cfg
Hint: (11031) End of reading config file /etc/fpc.cfg
Note: (11046) DWARF debug information cannot be used with smart linking on this target, switching to static linking
Free Pascal Compiler version 3.0.2+dfsg-2 [2017/04/09] for x86_64
Copyright (c) 1993-2017 by Florian Klaempfl and others
(1002) Target OS: Linux for x86-64
...
(9015) Linking ...
/usr/bin/ld.bfd: warning: /media/babaev-an/.../link.res contains output sections; did you forget -T?
/usr/bin/objcopy: ... : Нет такого файла
Error: (9013) Error while linking
Fatal: (10026) There were 1 errors compiling module, stopping
Fatal: (1018) Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode

Как побороть?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Судя по всему, настроить права папки.
Аватара пользователя
BadBoyAlex
постоялец
Сообщения: 119
Зарегистрирован: 08.06.2010 12:42:23
Откуда: Россия, Белгород
Контактная информация:

Сообщение BadBoyAlex »

Лекс Айрин писал(а):Судя по всему, настроить права папки.

Все права выставлены на чтение, запись и выполнение. Причём dll-ка туда компилится...
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

По всем путям откуда берутся файлы?
Если воспользоваться переводчиком, то стоит обратить внимание на такой текст "...contains output sections; did you forget -T?" " ...содержит разделы(секции) вывода; Ты забыл -Т?"
Тем более, что ошибка возникает как раз после этого.
Ответить