FAQ9-2

Q. .wavファイルをリソースにまとめるには

 よく,.WAVファイルを添付したアプリケーションを見かけますが,.WAVと.EXEがばらばらになっていると,ユーザーに勝手に.WAVだけ差し替えられてしまうかもしれないし,正しく配布されないかもしれないし,美しくないのでいやです.
 そこで,.wavファイルをリソースに組み込んで一つにまとめることはできないのでしょうか.
 一度リソースに組み込んでEXEファイルにまとめようとしたのですが,FindResource()のリソースの種類にRT_WAVEなんてないのでできませんでした.
 また,読み込めたとしてもどのようにしてメモリ上にある.wavデータを鳴らすことができるのでしょうか.
 教えてください.


A. RCファイルに記述して,FindResource()を使う

RCファイルへの記述とFindResource()の使用

 .wavファイルをリソースに組み込むには,まず,.RCファイルに以下のように記述します.
 WAVE1 WAVE mywave.wav
 最初の文字はリソースの名前で,任意の文字列かデファイン値を書きます.2番目の文字はリソースの種類です.一般に,ビットマップなどの場合は,
 BITMAP1 BITMAP mybitmap.bmp
などと書きますが,この2番目の文字BITMAPは定義済みの種類で,FindResource( x,x, RT_BITMAP ); というように読み込むことができます.
 しかし,WAVEの場合はRT_WAVEという種類は定義されていないために,FindResource()では読み込めないような気がしますが,リファレンスを見てみると,FindResource()の説明は以下のようになっています.
 HRSRC
 FindResource(hModule, lpszName, lpszType)
 HINSTANCE hModule;
 /* リソースモジュールのハンドル */
 LPCSTR lpszName;
 /* リソース名のアドレス */
 LPCSTR lpszType;
 /* リソースの種類のアドレス */
 3番目のパラメータは文字列を指すアドレスで,一般にリソースの種類を文字列で指定するようになっています.RT_BITMAPやRT_ICONなどは,たまたま定義済みの名前だったということで,WAVEのように定義されていないものはFindResource( x, x, "WAVE" ); というようにすれば,同じように読み込む(というか見つける)ことができます.リスト9-4は,WAVEリソースを読み込むプログラム例です.

[リスト9-4] :

LPVOID DoLockWaveResource( char* lpName ) {
	HRSRC hRsrc = FindResource( hInst, lpName, "WAVE");
	if( !hRsrc ) return NULL;
	HGLOBAL hMem = LoadResource( hInst, hRsrc ); 
	if( !hMem ) return NULL;
	return LockResource( hMem ); 
}

sndPlaySound()で鳴らす方法

 次に,読み込んだWAVEデータを鳴らす方法ですが,sndPlaySound()を使ってメモリ上にあるWAVEデータを鳴らすことができます.
 sndPlaySound()は通常.WAVファイルを再生する関数ですが,SND_MEMORYフラグを付けると,ファイル名のアドレスの代わりにメモリのアドレスをわたすだけで,メモリ上のWAVEデータを鳴らすことができるようになります.
 通常,.WAVファイルを鳴らす場合は,
 sndPlaySound(
  lpFilename,
  SND_SYNC |
  SND_NODEFAULT );
とし,リソースから読み込んだWAVEデータを鳴らす場合は,
 sndPlaySound(
  lpRes,
  SND_MEMORY |
  SND_SYNC |
  SND_NODEFAULT );
とします.

専用のリソースエディタを使っている場合

 最初に,.rcを書き換えてWAVEリソースを記述するように書きましたが,専用のリソースエディタを使っている場合は,ユーザー定義のリソースが作れるはずなので,WAVEというリソースの種類を自分で作ればなんとかなるはずです.
 現在筆者が利用しているVC2.0の場合,[リソース(R)|インポート(I)...]を選ぶことでWAVEリソースを作ることができました.
 ユーザー定義のリソースは,WAVEだけでなく,256色ビットマップ(DIB)やその他バイナリデータなど,何でもありになるので,添付ファイルが邪魔な人はすべてリソースにしましょう.

Back to FAQ main page