potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

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:この記事は別のブログで投稿した記事を移動したものです。