Не удалось извлечь файлы из файла ресурсов Delphi - PullRequest
0 голосов
/ 03 марта 2010

Я использую FindResource, LoadResource и LockResource для доступа к ресурсам в файле res. У меня есть волновой файл, который я хочу извлечь и воспроизвести через мое приложение Delphi.

Я сделал это без извлечения, но это не то, что я хочу сделать. Я хочу сначала извлечь файл волны. Кто-нибудь может указать мне правильное решение?

Ответы [ 2 ]

6 голосов
/ 04 марта 2010

Если вы уже звоните LoadResource и LockResource, то вы уже на полпути. LockResource дает указатель на первый байт данных ресурса. Вызовите SizeofResource, чтобы узнать, сколько там байтов, и вы можете делать с этим блоком памяти все, что захотите, например скопировать его в другой блок памяти или записать в файл.

resinfo := FindResource(module, MakeIntResource(resid), type);
hres := LoadResource(module, resinfo);
pres := LockResource(module, hres);
// The following is the only new line in your code. You should
// already have code like the above.
size := SizeofResource(module, resinfo);

Копировать в другой блок памяти:

var
  buffer: TBytes;

SetLength(buffer, size);
Move(pres^, buffer[0], size);

Запись в файл:

var
  fs: TStream;

fs := TFileStream.Create('foo.wav', fmCreate);
try
  fs.Write(pres^, size);
finally
  fs.Free;
end;

Это дает нам несколько способов воспроизведения этих волновых данных:

PlaySound(MakeIntResource(resid), module, snd_Resource);
PlaySound(PChar(pres), 0, snd_Memory);
PlaySound(PChar(@buffer[0]), 0, snd_Memory);
PlaySound('foo.wav', 0, snd_FileName);
3 голосов
/ 03 марта 2010

Вы можете использовать класс TResourceStream для загрузки ресурса WAVE и сохранения его на диск с помощью метода SaveToFile.

...