4

現在、コンパイルされたexeファイルの横にwaveファイルがある場合にのみ、バックグラウンドサウンドを再生できます。しかし、実際には、waveファイルを内部に含む単一の静的実行可能ファイルが必要です。これはDelphiXE2で可能ですか?

これは私のコードです:

SndPlaySound('.\Raw.wav', SND_ASYNC or SND_LOOP);
#This will play the Raw.wav that is next to my program.
4

4 に答える 4

11

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;
于 2012-05-14T00:54:06.990 に答える
6

PlaySound()の代わりにを使用するとsndPlaySound()SND_RESOURCEフラグを使用して、最初にメモリにロードしなくても、リソースから直接ウェーブサウンドを再生できます。

于 2012-05-14T03:34:06.127 に答える
2

テストしたばかりで、私のもので動作します:

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;

ここに画像の説明を入力してください

于 2012-05-14T01:23:12.320 に答える
2

リソースエディタ(Delphi 10、プロジェクト、リソース、および画像)でwavファイルをインポートするときにリソースタイプとして「WAVE」と入力し、単に使用します。

   PlaySound(resourceIndentifierName, 0, SND_RESOURCE or SND_ASYNC);

PS大文字は不要になりました

于 2017-12-24T11:31:01.170 に答える