|
Музыка в кряках [Delphi&KOL]
В этой статье речь
пойдет о том, как прикрутить к кряку,
написанному на Delphi, фоновую музыку в
формате xm. Сразу должен
оговориться: мы будем рассматривать
примеры для KOL, так как писать кряки с
использованием VCL да еще и музыку в
них добавлять - это преступление в
отношении dial-up'щиков и вообще против
всего человечества ;)
Для воспроизведения
трекерной музыки прямо из
ресурсов будем использовать
библиотеку MiniFMOD.
Изначально указанная библиотека
рассчитана на C и C++. Но народные
умельцы заставили ее работать и с Delphi
:). На www.cobans.net
эту проблему решили путем создания
внешней библиотеки minifmod.dll, а Twis с www.delphifr.com
предложил скомпилировать исходники
на C в .OBJ-файл, что избавило от необходимости
использовать DLL.
Сначала рассмотрим
пример использования внешней DLL.
Библиотека minifmod.dll
имеет
довольно небольшой размер (20 кБ, сжимается RAR'ом до 11 кБ),
что позволяет "запихнуть" ее в ресурсы программы и извлекать
оттуда по мере надобности.
Естественно, в этом случае нам
придется подключать библиотеку к
программам динамически.
Напомню, как поместить файл в
ресурсы программы. Пусть у нас
имеется файл music.xm. В каталоге проекта
создаем текстовый файл music.rc, в
котором записываем следующую строку:
MUZ RCDATA music.xm. Если файл music.xm находится
не в каталоге проекта, то вместо
"music.xm" нужно написать полный
путь к данному файлу, например,
c:\MyMusic\music.xm. Теперь нужно
скомпилировать .rc-файл, используя
компилятор ресурсов Borland Resource Compiler (brcc32.exe),
который находится в подкаталоге BIN
установочной директории Delphi. Для
этого можно просто перетащить music.rc
на значок brcc32.exe, после чего в
каталоге проекта появится файл
ресурсов music.res. Его-то мы и впихнем в
наш exe'шник, поместив в главном модуле
проекта после implementation строку
такого вида: {$R music.res}.
Итак, создадим файлы
ресурсов с музыкой и библиотекой
minifmod.dll с помощью Borland Resource Compiler (для чего сначала подготовим
mmu.rc и dl.rc, в которых укажем следующее:
dl.rc должен содержать текст:
MYDLL DLLFILE MiniFMOD.dll
mmu.rc должен содержать текст:
muz rcdata nf.xm
Ниже привожу
необходимую часть кода программы с
комментариями:
unit muz; {здесь
вырезана служебная информация,
автоматически добавляющаяся KOL} var
{Эти переменные и функции мы будем использовать во всех подпрограммах кряка}
filename:string; // в этой переменной будет храниться путь к minifmod.dll
hMod: Integer;
Hbar: Thandle;
{Описываем процедуры и функции, загружаемые из minifmod.dll}
SongLoadFromResource: function(FileName: PChar):Integer; cdecl;
SongPlay: procedure (hMod: Integer); cdecl;
SongStop: procedure (hMod: Integer); cdecl;
{далее идут автоматически вставляемые библиотекой KOL описания}
Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;
{$IFDEF KOL_MCK}
procedure NewForm1( var Result: PForm1; AParent: PControl );
{$ENDIF}
implementation
{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}
{$IFDEF KOL_MCK}
{$I muz_1.inc}
{$ENDIF}
{$R mmu.res} //помещаем наши файлы
в программу
{$R dl.res}
procedure splay; //процедура, управляющая
воспроизведением музыки
var
pch: PChar; // в pch будет храниться путь к dll для загрузки из нее функций
begin
pch:=PChar(filename); // преобразуем переменную в тип Char
Hbar := LoadLibrary(pch); // загружаем библиотеку minifmod.dll
if Hbar >= 32 then
begin
// из minifmod.dll загружаем необходимые процедуры и функции
SongLoadFromResource:= GetProcAddress(HBar, 'SongLoadFromResource');
// функция загрузки треков из ресурсов
SongPlay:= GetProcAddress(HBar, 'SongPlay'); // загружаем процедуру воспроизведения
SongStop:= GetProcAddress(HBar, 'SongStop'); // загружаем процедуру остановки музыки
hMod := SongLoadFromResource('muz');
// отправляем ресурс на воспроизведение
SongPlay(hMod);
// запуск воспроизведения музыки
end;
end;
procedure TForm1.KOLForm1BeforeCreateWindow(Sender: PObj); //
до отображения окна программы на
экране
var
// сохраняем minifmod.dll из
ресурсов на диск
ResourceStream : pStream;
buf: array[0..MAX_PATH - 1] of char;
WinTmpDir : string;
begin
GetTempPath(SizeOf(Buf),@Buf);
WinTmpDir:= IncludeTrailingPathDelimiter(copy(buf,1,lstrlen(@buf)));
try
ResourceStream := NewWriteFileStream(WinTmpDir + 'minifmod.dll');
Resource2Stream(ResourceStream,hinstance,'mydll','dllfile');
finally
ResourceStream.Free;
end;
filename:=(WinTmpDir + 'minifmod.dll' );
splay; //вызываем
процедуру, управляющую
воспроизведением музыки
end;
procedure TForm1.KOLForm1Destroy(Sender: PObj); //реакция
на завершение программы
begin
songstop(hmod); // останавливаем воспроизведение музыки
freelibrary(Hbar);
// выгружаем библиотеку, иначе она не удалится
DeleteFiles(filename); // удаляем minifmod.dll
end;
end.
Как видите, совсем не
много кода :). Давайте оценим "общий
вес" конечного файла: 14 кБ ("пустая"
форма) + 20 кБ (minifmod.dll) + 63 кБ (xm-файл)+16 кБ
(картинка в BMP) = 113 кБ. По-моему, у нас
получился слон ;-). Попробуем
обработать этого слона FSG v2.0 -
специальным супер-пакером для кряков.
Результат - 47 кБ - самое то! Исходники
демонстрационного примера можно
скачать здесь: http://biocyborg.narod.ru/rev/dxm.zip
Теперь посмотрим, как
решил проблему Twis. Он преобразовал C-исходник
библиотеки MiniFMOD в объектный файл и
подготовил модуль minifmod.pas, в котором
описал процедуры и функции
библиотеки, указал подключение
.OBJ-файла, а также добавил необходимые
функции, которые не были включены в .OBJ-файл.
Таким образом, воспроизведение
фоновой музыки прямо из ресурсов
стало простейшей задачей:
unit
muz; //в uses нужно добавить minifmod (не
забудьте положить minifmod.pas minifmod.obj в
каталог с исходниками кряка) {здесь
пропущено описание переменных} {$R
mmu.res} // подключаем файл с
музыкой; mmu.rc должен содержать текст
XMMOD MUSIC melody.xm
procedure TForm1.KOLForm1FormCreate(Sender:
PObj); //при запуске
программы начинаем воспроизведение
begin
XMPlayFromRes('XMMOD', 'MUSIC');
end;
procedure TForm1.KOLForm1Close(Sender: PObj; var Accept: Boolean);
begin
XMFree;
end;
Здесь
Вы можете скачать архив с примерами и
всеми необходимыми файлами (если
возникли проблемы, попробуйте
скачать с моего сайта).
Размер minifmod.obj можно
уменьшить на несколько килобайт (при
этом уменьшится и конечный
исполнимый файл), если
перекомпилировать minifmod.c для
конкретного музыкального файла. Об
этом подробно написано в
документации от Twis'a.
Если у Вас возникли
какие-либо сложности с
использованием библиотеки MiniFMOD,
обращайтесь - обязательно
постараемся помочь!
P.S. Немного о midi. Музыка в
таком формате по-разному звучит на
компьютерах с разными звуковыми
картами, поэтому ее лучше не
использовать. Но этот формат имеет
преимущества в размере файлов,
которые очень хорошо сжимаются
архиваторами и пакерами. Для проигрывания midi
можно использовать модуль mmsystem или
MediaPlayer. Если Вам это интересно, можете
скачать пример, который я быстро
набросал для демонстрации
использования mmsystem. В нем нет ничего
особенного, но, возможно, кому-нибудь
пригодится.
P.P.S. MiniFMOD позволяет
проигрывать файлы только
в формате xm. Если у Вас музыка в
другом формате (.mod, s3m, it и др.p), ее
можно конвертировать в xm с помощью
редактора трекерной музыки, например
MODPLUG TRACKER (для чего следует просто
открыть файл и сохранить его с
расширением .xm).
© BioCyborG, 2004
|