|
Windowsの実行ファイルやDLLには、プログラムのコードの他に任意のデータを「リソース」として追加することができます。リソースを使うと各種アイコンやビットマップ、メニュー、文字列などさまざまなデータを一つの実行ファイルにまとめられるので、配布やプログラムのコピーが楽になるという利点があります。 実行ファイルへのリソース追加実行ファイルにリソースを入れるのは簡単で、リソース化するデータを収めたデータファイルとそのデータに名前を付けて実行ファイルにリンクするための設定ファイル(リソーススクリプト/RCファイル)を用意し、コンパイル・リンクするだけです。今回は、test.wavというサウンドファイルの内容をTESTDATAという名前でリソースにすることにしました。この場合、test.wavのバイナリイメージをリソースTESTDATAとして実行ファイルに追加するためのリソーススクリプトは、以下のようになります。 TESTDATA WAV_DAT DISCARDABLE "test.wav" なお、WAV_DATというのは、リソースのデータ形式です。ここにデータの形式をあらわす文字列を設定しておくと、VC++などのリソースエディタでその文字列をもとにデータをグループ化できるので、管理が楽になるでしょう。 リソーススクリプトができたら、コンパイル後実行ファイルにリンクします。BC++の場合は、リソースコンパイラbcr32を使って bcr32 リソーススクリプトファイル名 実行ファイル名 とするとリソースが作成され、実行ファイルにリンクされます。VC++の場合は、プロジェクトにリソーススクリプトファイルを追加してビルドすると、実行ファイルにリソースが追加されます。いずれも、リソーススクリプトとリソースとして読み込むデータファイルを同じディレクトリに入れておいてください。 実行ファイル内リソースからのデータ読み込みこのようにして実行ファイルに追加したリソースのデータは、プログラムから簡単に読み込むことができます。具体的な手順は、
という流れになります。今回は、サウンドファイルをリソースにしたので、以下のようにそのデータをメモリ上に読み込んで再生する処理を書いてみました。 /* リソースからサウンドデータを読み込む */ hTest = LoadResource(NULL, FindResource(NULL, "TESTDATA", "WAV_DAT")); /* 読み込んだデータのポインタ取得 */ lpTest = (LPTSTR)LockResource(hTest); /* サウンドデータを再生 */ sndPlaySound(lpTest, SND_SYNC | SND_MEMORY); これで、リソースTESTDATAをメモリlpTestに読み込んで、そのサウンドイメージを再生することができます。 プログラム以下のrctest.c/rctest.rc、それに適当なwavファイルをtest.wavというファイル名で同じディレクトリに置いてください。VC++の場合は、そのディレクトリにWin32コンソールアプリケーションのプロジェクトを作成し、rctest.c/rctest.rcをプロジェクトに追加してビルドします。 BC++5.5.1では、まずrctest.cをコンパイルしてrctest.exeを作成し、次にリソースコンパイラbrc32でrctest.exeとリソースをリンクします。 BC++のコマンドライン例bcc32 rctest.c brc32 rctest.rc rctest.exe 実行すると、test.exeに追加したtest.wavのサウンドが再生されます。test.wavを削除したり、実行ファイルを他の場所に移すなどして実際にデータが実行ファイルに取り込まれていることを確認してみましょう。
======================= rctest.c ==============================
#include <windows.h>
/* VC++では、このコメントをはずす
#pragma comment(lib, "winmm.lib")
*/
int main() {
HANDLE hTest;
LPBYTE lpTest;
/* リソースからサウンドデータを読み込む */
hTest = LoadResource(NULL, FindResource(NULL, "TESTDATA", "WAV_DAT"));
/* 読み込んだデータのポインタ取得 */
lpTest = (LPTSTR)LockResource(hTest);
/* サウンドデータを再生 */
sndPlaySound(lpTest, SND_SYNC | SND_MEMORY);
return 0;
}
===============================================================
======================= rctest.rc =============================
TESTDATA WAV_DAT DISCARDABLE "test.wav"
===============================================================
|