GetWindowLongPtrとSetWindowLongPtrに P/Invoke したいのですが、それらに関する矛盾する情報が表示されます。
一部のソースによると、32 ビット プラットフォームでは、GetWindowLongPtr は GetWindowLong を呼び出す単なるプリプロセッサ マクロであり、GetWindowLongPtr は user32.dll のエントリ ポイントとして存在しません。例えば:
- SetWindowLongPtrのpinvoke.net エントリには、IntPtr.Size をチェックしてから SetWindowLong または SetWindowLongPtr を呼び出す静的メソッドがあり、「レガシー OS は SetWindowLongPtr をサポートしていません」というコメントがあります。「レガシーOS」が何を意味するのかについての説明はありません。
- StackOverflowに関する回答には、「32 ビット システムでは、GetWindowLongPtr は、GetWindowLong を指す単なる C マクロです」と記載されています。
したがって、これらのソースは、*Ptr エントリ ポイントが、たとえば 32 ビット Windows 7 に同梱されているバージョンの user32.dll には存在しないことを示しているようです。
しかし、MSDN のドキュメントにはこれに関する記述はありません。MSDN によると、 SetWindowLongPtr はSetWindowLongに取って代わり、単純明快です。また、 SetWindowLongPtr ページの要件セクションによると、SetWindowLongPtr は Windows 2000 以降 (クライアント エディションとサーバー エディションの両方) に user32.dll に含まれているようです。繰り返しになりますが、32 ビット OS で欠落しているエントリ ポイントについては言及されていません。
真実はその中間にあるのではないかと思います: C++ コンパイラに古い OS をターゲットにする (つまり、Win9x と NT4 で実行されるものをコンパイルする) ように指示すると、ヘッダー ファイルは SetWindowLongPtr を SetWindowLong を呼び出すマクロとして宣言しますが、エントリ ポイントはおそらく Windows 2000 以降に存在し、これらのプラットフォームをターゲットにするようにコンパイラに指示すると、(マクロではなく) 直接取得できます。しかし、それは単なる推測です。私はそれを掘り下げて検証するためのリソースやノウハウを本当に持っていません。
ターゲット プラットフォームが役割を果たす可能性もあります。x86 プラットフォーム用にアプリをコンパイルする場合は、64 ビット OS で SetWindowLongPtr を呼び出すべきではありません。繰り返しますが、私はその質問について考えるのに十分な知識を持っていますが、答えを見つける方法がわかりません. MSDN は、SetWindowLongPtr が常に正しいことを示唆しているようです。
単純に SetWindowLongPtr に P/Invoke を実行して、それを実行しても安全かどうか教えてもらえますか? (Windows 2000 以降を想定しています。) SetWindowLongPtr を P/Invoking すると、正しいエントリ ポイントが得られます。
- 32 ビット OS で x86 プラットフォームを対象とするアプリを実行するとどうなりますか?
- x86 プラットフォームを対象とするアプリを 64 ビット OS で実行するとどうなりますか?
- x64 プラットフォームを対象とするアプリを 64 ビット OS で実行するとどうなりますか?