Музыка в кряках [Delphi&KOL] В этой статье речь пойдет о том, как прикрутить к кряку, написанному на Delphi, фоновую музыку в формате xm. Сразу должен оговориться: мы будем рассматривать примеры для KOL, так как писать кряки с использованием VCL да еще и музыку в них добавлять - это преступление в отношении dial-up'щиков и вообще против всего человечества ;) К сожалению, я не знаю нормальных способов воспроизведения трекерной музыки в программах на Delphi без использования внешних библиотек. Поэтому будем использовать портированную под Делфи библиотеку MiniFMOD с cobans.net. Указанная библиотека позволяет проигрывать из ресурсов только файлы в формате xm. Если у Вас музыка в другом формате (.mod, s3m, it и др.), ее можно конвертировать в xm с помощью редактора трекерной музыки, например MODPLUG TRACKER (для чего следует просто открыть файл и сохранить его с расширением .xm). Библиотека 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}. Итак, рассмотрим пример проигрывания музыки в формате xm с помощью minifmod.dll. Как было указано выше, данная библиотека может воспроизводить трекерную музыку непосредственно из ресурсов. Поэтому для осуществления поставленной задачи нам придется извлекать из ресурсов кряка только саму библиотеку. Создадим файлы ресурсов с музыкой и библиотекой 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 кБ - самое то! © BioCyborG, 2004