Как проиграть Wave-ресурс

Сначала делаешь файл SOUND.RC, в нем строка вида: MY_WAV RCDATA TEST.WAV Компилишь чем-нибyдь в *.RES

Далее в тексте:

{$R полное_имя_файла_с_ресурсом}

var

WaveHandle: THandle;

WavePointer: pointer;

...

WaveHandle := FindResource(hInstance, 'MY_WAV', RT_RCDATA);

if WaveHandle 0 then

begin

WaveHandle := LoadResource(hInstance, WaveHandle);

if WaveHandle 0 then

begin

;

WavePointer := LockResource(WaveHandle);

PlayResourceWave := sndPlaySound(WavePointer, snd_Memory or

SND_ASYNC);

UnlockResource(WaveHandle);

FreeResource(WaveHandle);

end;

end;

Как локализовать (русифицировать) ресурсы какого-либо пакета (runtime package)

Вот, случайно набpели в хэлпе. Если нужно изменить pесуpсы какого-либо модуля,то это можно делать с помощью нехитpой опеpации:

Вынимаете pесуpсы из этого модуля.

Пеpеводите их на дpугой язык. (напpимеp pусский)

Создаете в Delphi свой пpоект Dll-ки (с именем того модуля, из котоpого вы вынули pесуpсы, напpимеp vcl30), в котоpый включаете _пеpеведенные_ pесуpсы: {$R vcl30rus.res}

Собиpаете все это.

Пеpеименовываете полученную vcl30.Dll в vcl30.rus и кидаете ее в System.

Если вы хотите, пpиложение «говоpило» по pусски только тогда, когда в pегиональных установках стоит Russia — то тогда это все.Если же вы хотите, чтобы ваше пpиложение _всегда_ поднимало pусские pесуpсы,то необходимо сделать следующее добавление в Registry:HKEY_CURRENT_USER\SOFTWARE\Borland\Delphi\Locales «X:\MyProject\MyApp.exe» = «rus»

Тепеpь, когда ваше пpиложение будет поднимать pakages, то всегда будут бpаться pусские pесуpсы. Дpугие пpиложения, напpимеp Delphi — это не затpонет.Таким обpазом можно заменять даже DFM-ки из пpоекта.

Более подpобно об этом — см Help — Index — Localizing…

 

Как из своего пpиложения опpеделить загpузку pесуpсов GDI и USER

Автор: Nomadic

{$APPTYPE CONSOLE}

// индикатоp pесуpсов

program res;

function MyGetFreeSystemResources32(Id: integer): integer;

stdcall; external 'rsrc32' name '_MyGetFreeSystemResources32@4';

const

rSystem = 0;

rGDI = 1;

rUSER = 2;

begin

writeln('free resources');

writeln('System:', MyGetFreeSystemResources32(rSystem), '%');

writeln('GDI:', MyGetFreeSystemResources32(rGDI), '%');

writeln('USER:', MyGetFreeSystemResources32(rUSER), '%');

end.

Как добавить в исполняемый файл WAV-файл и затем проиграть этот звук

// В файл MyWave.rc пишешь:

// MyWave RCDATA LOADONCALL MyWave.wav

// Затем компилируешь

// brcc32.exe MyWave.rc, получаешь MyWave.res.

// В своей программе пишешь:

// {$R MyWave.res}

// или используешь программу для работы с ресурсами

// ( н-р Borland Resource WorkShop) для получения res файла

procedure RetrieveMyWave;

var

hResource: THandle;

pData: Pointer;

begin

hResource:=LoadResource( hInstance, FindResource(hInstance, 'MyWave', RT_RCDATA));

try

pData := LockResource(hResource);

if pData = nil then

raise Exception.Create('Cannot read MyWave');

// Здесь pData указывает на MyWave

// Теперь можно, например, проиграть его (Win32):

PlaySound('MyWave', 0, SND_MEMORY);

finally

FreeResource(hResource);

end;

end;

Использование Bitmap из ресурса

{

Create and edit a new text file in your project directory,

eg: newres.txt

In the file, write:

MY_BMP_RES BITMAP "bmpname.bmp"

and save the file.

Open a dos shell and go to your directory, type this command:

brcc32.exe newres.txt

this will create a resource file called newres.res with your bitmap.

}


unit Unit1;

implementation

{$R *.DFM}

{$R newres.res} // add this line!

procedure TForm1.FormCreate(Sender: TObject);

var

MyBmp: TBitmap;

begin

MyBmp := TBitmap.Create;

try

MyBmp.LoadFromResourceName(HInstance, 'MY_BMP_RES');

// Do something....

finally

MyBmp.Free;

end;

end;

Изменить ресурсные строки во время выполнения

uses

Consts;

procedure TForm1.Button1Click(Sender: TObject);

begin

InputBox('Test', 'Enter something', 'Test');

end;

procedure HookResourceString(rs: PResStringRec; newStr: PChar);

var

oldprotect: DWORD;

begin

VirtualProtect(rs, SizeOf(rs^), PAGE_EXECUTE_READWRITE, @oldProtect);

rs^.Identifier := Integer(newStr);

VirtualProtect(rs, SizeOf(rs^), oldProtect, @oldProtect);

end;

const

NewOK: PChar = 'New Ok';

NewCancel: PChar = 'New Cancel';

initialization

HookResourceString(@SMsgDlgOK, NewOK);

HookResourceString(@SMsgDlgCancel, NewCancel);

end.

Загрузить RTF текст из файла ресурса в TRichEdit

Load RTF file from resource:

You can store any kind of file as a RCDATA resource.

The following example shows this with an RTF file.

Create a text file called textres.rc and put the

following line in it:

TESTDOC RCDATA «textdoc.rtf»

Next, compile that using the Borland Resource Compiler,

which is provided with Delphi.

brcc32.exe textres.rc

Your next step is to include the compiled resource (.RES) file into

your executable, which can be done with the {$R} compiler directive.

implementation

{$R *.dfm}

{$R textres.res} // <---- your resource file!

procedure TForm1.Button1Click(Sender: TObject);

var

rs: TResourceStream;

begin

rs := TResourceStream.Create(hinstance, 'TESTDOC', RT_RCDATA);

try

Richedit1.PlainText := False;

TempStream.Position := 0;

Richedit1.Lines.LoadFromStream(rs);

finally

rs.Free;

end;

end;

Вставить программу внутрь EXE файла

1. Пишем в блокноте RC-файл, куда прописываем все нужные нам программы, например:

ARJ EXEFILE C:\ARHIVERS\ARJ.EXE

2. Компилируем его в ресурс при помощи Brcc32.exe. Получаем RES- файл.

3. Далее в тексте нашей программы:

implementation

{$R *.DFM}

{$R test.res} //Это наш RES-файл

// Процедура для извлечения ресурса в указанный файл

procedure ExtractRes(ResType, ResName, ResNewName : String);

var

Res : TResourceStream;

begin

Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));

Res.SavetoFile(ResNewName);

Res.Free;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

// Записывает в текущую папку arj.exe

ExtractRes('EXEFILE', 'ARJ', 'ARJ.EXE');

end;

Включение wav-файла в exe и проигрывание этого wav-файла

Включение wav-файла в exe и проигрывание этого wav-файла

Зависимости: Uses MMSystem

// В файл MyWave.rc пишешь:

MyWave RCDATA LOADONCALL MyWave.wav

// Затем компилируешь

brcc32.exe MyWave.rc, получаешь MyWave.res.

// В своей программе пишешь:

{$R MyWave.res}

procedure RetrieveMyWave;

var

hResource: THandle;

pData: Pointer;

begin

hResource := LoadResource(hInstance, FindResource(hInstance, 'MyWave',

RT_RCDATA));

try

pData := LockResource(hResource);

if pData = nil then

raise Exception.Create('Cannot read MyWave');

// Здесь pData указывает на MyWave

// Теперь можно, например, проиграть его (Win32):

PlaySound(pData, 0, SND_MEMORY SND_ASYNC SND_NOSTOP);

//Для PlaySound используется модуль MMSystem}

//SND_ASYNC - при проигрывании не останавливать работу программы

//SND_NOSTOP - проиграть звук до конца

//SND_STOP - прекратить играть прежний звук и начать новый

finally

FreeResource(hResource);

end;

end;

256-цветное изображение из res-файла

Вот функция, правильно читающая 256-цветные изображения из файла ресурсов.

function LoadBitmap256(hInstance: HWND; lpBitmapName: PChar): HBITMAP;

var

hPal, hRes, hResInfo: THandle;

pBitmap: PBitmapInfo;

nColorData: Integer;

pPalette: PLogPalette;

X: Integer;

hPalette: THandle;

begin

hResInfo := FindResource(hInstance, lpBitmapName, RT_BITMAP);

hRes := LoadResource(hInstance, hResInfo);

pBitmap := Lockresource(hRes);

nColorData := pBitmap^.bmiHeader.biClrUsed;

hPal := GlobalAlloc(GMEM_MOVEABLE, (16 * nColorData));

{ hPal := GlobalAlloc( GMEM_MOVEABLE, ( SizeOf( LOGPALETTE )

(nColorData * SizeOf( PALETTEENTRY )));}


pPalette := GlobalLock(hPal);

pPalette^.palVersion := $300;

pPalette^.palNumEntries := nColorData;

for x := 0 to nColorData do

begin

pPalette^.palPalentry[X].peRed := pBitmap^.bmiColors[X].rgbRed;

pPalette^.palPalentry[X].peGreen := pBitmap^.bmiColors[X].rgbGreen;

pPalette^.palPalentry[X].peBlue := pBitmap^.bmiColors[X].rgbBlue;

end;

hPalette := CreatePalette(pPalette^);

GlobalUnlock(hRes);

GlobalUnlock(hPal);

GlobalFree(hPal);

end;

end.