何回か、メッセージ リソースというものを取り上げます。
メッセージ リソースとは、アイコンやバージョン情報と同様、exe ファイルや dll ファイルに持たせることができるリソースの一種ですが、Visual Studio のリソース エディタで作成できないため、あまり知られていないものではないかと思われます。
メッセージ リソースを作成するためには、まず、そのソースとなるメッセージ定義ファイルを書きます。
これを、Windows SDK に付属しているメッセージ コンパイラ(mc.exe)でコンパイルしてバイナリ形式に変換し、それをリソースに埋め込みます。
なお、Visual C++ 2008 Express には、メッセージ コンパイラが付属していませんので、別途 Windows SDK をインストールする必要があります。
メッセージ定義ファイルの書き方や、メッセージ コンパイラの使い方は、MSDN Library の Message Compiler のところに書かれています。
MSDN では、イベント ログ関係のページとして書かれているところからもわかるように、メッセージ リソースの主な用途はイベント ログです。
そのため、この連載でもイベント ログについてとりあげますが、それは連載の終盤になる予定です。
その前に、次回以降で、イベント ログ以外の使い方を紹介します。
では、早速作ってみましょう。
まず、Visual Studio を立ち上げ、VC++ で新しい Win32 コンソール アプリケーション プロジェクトを作成します。
ウィザードでは「空のプロジェクト」を選びましょう。
次に、ソリューション エクスプローラのリソース フォルダに、メッセージ定義ファイルを追加しましょう。
カテゴリには出てこないので、とりあえずテキスト ファイルを選んでおきます。
拡張子は何でもいいですが、ここでは .mc としました。
そのファイルを開いて、以下のような内容を書き込みます(VC++ 上では色分けはされません)。
;// コメントはヘッダー ファイルに反映されるので、C++ 形式で書く必要があります。
MessageIdTypedef=DWORD
LanguageNames=(
English=0x0409:MSG_EN
Japanese=0x0411:MSG_JA
)
MessageId=0x0001
Severity=Informational
Facility=Application
SymbolicName=MSGID_SAMPLE_0001
Language=English
This is Message Resource Sample.
.
Language=Japanese
メッセージ リソースのサンプルです。
.
次に、ファイルのプロパティを開いて、ビルド方法を設定します。
Visual Studio はメッセージ リソースをビルドする方法を知らないので、自分でコンパイラの設定をしてやる必要があります。
とりあえず、以下のようにすればよいでしょう。
設定したら、ソリューション エクスプローラでこのファイルを右クリックして「コンパイル」を選びます。
終わったら、同じフォルダに、MsgRes.h、MsgRes.rc、MSG_EN.bin、MSG_JA.bin の4つのファイルができていることを確認してください。
これらのファイルを、プロジェクトに追加しておきましょう。MsgRes.h はヘッダー ファイル フォルダに、それ以外はリソース ファイル フォルダでいいでしょう。
それでは、先ほど記述したファイルの内容を解説します。
- コメント
- .mc ファイルに書いたコメントは、ヘッダー ファイルに反映されます。
MsgRes.h を開いてみると、一番上に、.mc ファイルに書いたコメントがあります。
そのため、.mc ファイル中でも、それを意識してコメントを書く必要があります。
- MessageIdTypedef
- MsgRes.h を見ると、
#define MSGID_SAMPLE_0001 ((DWORD)0x40000001L)
という記述があるかと思います。
この (DWORD) が、MessageIdTypedef=DWORD で指定したものです。
MessageIdTypedef=WORD とすれば、生成されるコードは #define MSGID_SAMPLE_0001 ((WORD)0x40000001L)
になります。
- LanguageNames
- 言語名を定義し、言語識別子とファイル名を関連付けます。
言語名は、その後のメッセージ定義で使用しています。
ファイル名は、メッセージ コンパイラが生成する .bin ファイルの名前になります。
- MessageId
- メッセージの識別子です。
Severity と Facility を上位ワード、この識別子を下位ワードとしたものが、実際のメッセージ識別子になります。
その値は、MsgRes.h に書き込まれます。
以降、メッセージ識別子に関する話が出てきますが、MsgRes.h に構造が書かれているので、それを見ながらだとわかりやすいと思います。
- Severity
- メッセージの重大さです。
この値は、メッセージ識別子の上位 2 ビットに反映されます。
標準では、成功=0、情報=1、警告=2、エラー=3 となっていますが、SeverityNames ステートメントを使うことで、自分で名前を定義することもできます(2 ビットしかないため、値は 0 ~ 3 しか使えません)。
今回は、メッセージ識別子の上位 2 ビットが 01 なので、0x4000~ になっているわけです。
- Facility
- メッセージのファシリティ値(日本語ではどう言えばいいんでしょう?)を指定します。
この値は、メッセージ識別子のビット 16 ~ 27 に書き込まれます。
標準では、Application=0 のようです。他に何が定義されているのかはわかりません(MSDN の記述は間違えているようです)。
FacilityNames ステートメントを使うことで、自分で名前を定義することができます。こちらは、任意の 12 ビットの値を使えます(たぶん)。
- SymbolicName
- MsgRes.h に定義される値の名前です。
- Language
- LanguageNames で定義した言語名です。
- メッセージ本体
- メッセージの本体を記述します。
最後に、ピリオドだけの行を置くと、メッセージ本体の終端を意味します(ピリオドはメッセージ本体に含まれません)。
複数行書くことも可能です。
次回は、このメッセージを使う方法です。