我目前只能通过将我的wave文件放在编译的exe旁边来播放我的背景声音。但我实际上想要一个带有wave文件的静态可执行文件。这在Delphi XE2中是否可行?
这是我的代码:
SndPlaySound('.\Raw.wav', SND_ASYNC or SND_LOOP);
#This will play the Raw.wav that is next to my program.
答案 0 :(得分:10)
您可以添加SND_MEMORY标记,并将TResourceStream.Memory
指针作为第一个参数传递。
首先,使用XE2的Project->Resources and Images
菜单项添加新资源。为它提供.wav文件的路径和文件名,资源类型为RC_DATA
(它不在下拉列表中,但您可以手动输入),以及您可以在运行时使用的资源名称它。 (在我的示例中,我使用的是C:\Microsoft Office\Office12\MEDIA\APPLAUSE.WAV
,并为其提供了资源名称APPLAUSE
。)
procedure TForm2.Button1Click(Sender: TObject);
var
Res: TResourceStream;
begin
Res := TResourceStream.Create(HInstance, 'APPLAUSE', 'RC_DATA');
try
Res.Position := 0;
SndPlaySound(Res.Memory, SND_MEMORY or SND_ASYNC or SND_LOOP);
finally
Res.Free;
end;
end;
答案 1 :(得分:5)
如果您使用PlaySound()
代替sndPlaySound()
,则可以使用SND_RESOURCE
标志直接从其资源播放wave声音,而无需先将其加载到内存中。
答案 2 :(得分:1)
刚刚测试过,它适用于我的:
var
hFind, hRes: THandle;
Song : PChar;
begin
hFind := FindResource(HInstance, 'BATTERY', 'WAV');
if (hFind <> 0) then
begin
hRes := LoadResource(HInstance, hFind);
if (hRes <> 0) then
begin
Song := LockResource(hRes);
if Assigned(Song) then
begin
SndPlaySound(Song, snd_ASync or snd_Memory);
end;
UnlockResource(hRes);
end;
FreeResource(hFind);
end;
答案 3 :(得分:0)
在资源编辑器中导入wav文件时键入“WAVE”作为资源类型(Delphi 10,Project,Resources and Images) 并简单地使用
PlaySound(resourceIndentifierName, 0, SND_RESOURCE or SND_ASYNC);
P.S。不再需要大写