1. ホーム
  2. c++

[解決済み] MAKEINTRESOURCE()はなぜ動作するのですか?

2022-02-25 23:21:35

質問

マクロは次のように定義されています。

#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))

なぜ、リソースID(16ビットの符号なしint)とその名前(charの配列へのポインタ)のどちらを示すのにも使えるのでしょうか? これでは、(32ビットシステムの)アドレス空間が事実上16ビットに制限されることになりませんか?そうでなければ、システムは私がIDを使用しているのか名前を使用しているのかどうやって知るのでしょうか?

どのように解決するのですか?

これは、Windowsがアドレス空間の最初の64KBにページをマッピングすることを許可していないために動作します。 ヌルポインターの参照を捕捉するため。 しかし、16ビット版のWindowsから変換されたプログラムのポインタのバグをキャッチするためでもあると思います。

副次的な効果として、ポインタ値にパックされたリソースIDは常にマッピング不可能なメモリを指すことになるので、確実に区別できるようになります。