potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

Win32 API リソースIDのマクロ

概要

Win32 APIのリソースIDの定義や操作で使用されるマクロの簡単な情報です。具体的には次のマクロの概要を説明します。

  1. IS_INTRESOURCE
  2. MAKEINTRESOURCE[A/W]

リソースIDは環境(32、64ビットあるいはA/W)に関わらず、16ビットの範囲内にあれば整数型、それ以外は文字列型(文字列へのポインタ)や特殊項目のID(ポップアップメニューやセパレータのID)として扱われます。

IS_INTRESOURCE

#define IS_INTRESOURCE(_r) ((((ULONG_PTR)(_r)) >> 16) == 0)

IDが整数型であれば真、文字列型(文字列へのポインタ)であれば偽を返します。具体的には与えられた値(整数やポインタ)が16ビット以下の範囲内(16ビット整数)に納まるかどうかを確認します。このマクロの戻り値が偽の場合、IDは文字列型あるいは特殊項目のIDです。

  1. IS_INTRESOURCE - MSDN

MAKEINTRESOURCE[A/W]

#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
#ifdef UNICODE
#define MAKEINTRESOURCE  MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE  MAKEINTRESOURCEA
#endif // !UNICODE

整数型のID(16ビット整数)を文字列型に変換します。A/W版の違いは戻り値のポインタの型がLPSTRとLPWSTRのどちらにキャストされるかだけです。

  1. MAKEINTRESOURCE - MSDN

参考

1.Menus and Other Resources - MSDN 1.Resource Macros - MSDN

2021/3/10:この記事は別のブログで投稿した記事を移動したものです。