1

C++ では、単純にポインタを DWORD にキャストできますか?

MyClass * thing;
DWORD myPtr = (DWORD)thing;

それはうまくいくでしょうか?

4

4 に答える 4

6

Windows では、たとえば Windows メッセージで、このような方法でポインターを渡すことは非常に一般的です。LPARAM は LONG_PTR の typedef であり、いくつかの構造体へのポインターを渡すためによく使用されます。reinterpret_cast<DWORD_PTR>(thing)キャストに使用する必要があります。

于 2014-01-03T23:34:29.467 に答える
6

あなたは間違いなくそれを行うことができます。

それが機能するかどうかは、環境と何をしたいかによって異なります。

32 ビットの Windows 1 (最も一般的に表示される場所DWORD) では、通常は問題ありません。64 ビットの Windows ( も表示されますDWORDが、それほど多くはありません) では、通常は表示されません。


  1. または、より正確には、実行する Windows の実際のコピーに関係なく、32 ビット プロセスとして実行される 32 ビット実行可能ファイルとしてコンパイルされます。
于 2014-01-03T23:34:39.897 に答える
4

いいえ、64 ビット プロセスでは、ポインタは 64 ビットですが、DWORD は 32 ビットしかありません。DWORD_PTR を使用します。

于 2014-01-03T23:31:46.190 に答える
1

http://en.cppreference.com/w/cpp/language/explicit_cast

それを読んで、それを理解して、C スタイルのキャストを避けてください。

そうすることはできるかもしれませんが、意味がありません。たとえば、DWORD は 4 バイトで、ポインター (最近) は 8 バイトです。

reinterpret_cast<DWORD&>(myPtr);

動作するはずですが、未定義または切り捨てられている可能性があります。

ところで、reinterpret_cast「私の親愛なるコンパイラを信頼してください。私が何をしているのか知っています」と言う C++ の方法です。それがどれほど意味があるかに関係なく、あるもののビット (0 と 1) を別のものとして解釈しようとします。

正当な使用法として有名な 1/sqrt ハックがあります ;)

于 2014-01-03T23:33:41.013 に答える