現在、コンパイルされたexeファイルの横にwaveファイルがある場合にのみ、バックグラウンドサウンドを再生できます。しかし、実際には、waveファイルを内部に含む単一の静的実行可能ファイルが必要です。これはDelphiXE2で可能ですか?
これは私のコードです:
SndPlaySound('.\Raw.wav', SND_ASYNC or SND_LOOP);
#This will play the Raw.wav that is next to my program.
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;
PlaySound()
の代わりにを使用するとsndPlaySound()
、SND_RESOURCE
フラグを使用して、最初にメモリにロードしなくても、リソースから直接ウェーブサウンドを再生できます。
テストしたばかりで、私のもので動作します:
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;
リソースエディタ(Delphi 10、プロジェクト、リソース、および画像)でwavファイルをインポートするときにリソースタイプとして「WAVE」と入力し、単に使用します。
PlaySound(resourceIndentifierName, 0, SND_RESOURCE or SND_ASYNC);
PS大文字は不要になりました