Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

2008年9月19日 #

連載:メッセージ リソース(1)

何回か、メッセージ リソースというものを取り上げます。
メッセージ リソースとは、アイコンやバージョン情報と同様、exe ファイルや dll ファイルに持たせることができるリソースの一種ですが、Visual Studio のリソース エディタで作成できないため、あまり知られていないものではないかと思われます。

メッセージ リソースを作成するためには、まず、そのソースとなるメッセージ定義ファイルを書きます。
これを、Windows SDK に付属しているメッセージ コンパイラ(mc.exe)でコンパイルしてバイナリ形式に変換し、それをリソースに埋め込みます。
なお、Visual C++ 2008 Express には、メッセージ コンパイラが付属していませんので、別途 Windows SDK をインストールする必要があります。

メッセージ定義ファイルの書き方や、メッセージ コンパイラの使い方は、MSDN Library の Message Compiler のところに書かれています。
MSDN では、イベント ログ関係のページとして書かれているところからもわかるように、メッセージ リソースの主な用途はイベント ログです。
そのため、この連載でもイベント ログについてとりあげますが、それは連載の終盤になる予定です。
その前に、次回以降で、イベント ログ以外の使い方を紹介します。

では、早速作ってみましょう。

まず、Visual Studio を立ち上げ、VC++ で新しい Win32 コンソール アプリケーション プロジェクトを作成します。
ウィザードでは「空のプロジェクト」を選びましょう。
image

次に、ソリューション エクスプローラのリソース フォルダに、メッセージ定義ファイルを追加しましょう。
カテゴリには出てこないので、とりあえずテキスト ファイルを選んでおきます。
拡張子は何でもいいですが、ここでは .mc としました。
 image

そのファイルを開いて、以下のような内容を書き込みます(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 はメッセージ リソースをビルドする方法を知らないので、自分でコンパイラの設定をしてやる必要があります。
とりあえず、以下のようにすればよいでしょう。 
image

設定したら、ソリューション エクスプローラでこのファイルを右クリックして「コンパイル」を選びます。
終わったら、同じフォルダに、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 で定義した言語名です。
メッセージ本体
メッセージの本体を記述します。
最後に、ピリオドだけの行を置くと、メッセージ本体の終端を意味します(ピリオドはメッセージ本体に含まれません)。
複数行書くことも可能です。

次回は、このメッセージを使う方法です。

posted @ 16:50 | Feedback (185)