5

Windows Data Types に関する MSDN ドキュメントから理解しているように、 aHWNDは a と同等void*です。

HWND - ウィンドウへのハンドル。この型は、WinDef.h で次のように宣言されています。 typedef HANDLE HWND; HANDLE - オブジェクトへのハンドル。この型は、WinNT.h で次のように宣言されています。 typedef PVOID HANDLE; PVOID - 任意の型へのポインター。この型は、WinNT.h で次のように宣言されています。

ただし、次のことを試してみると:

int foo;
HWND bar = &foo;

私のコンパイラ(VS2012)は文句を言います:

error C2440: '=' : cannot convert from 'int *' to 'HWND'
Types pointed to are unrelated; conversion requires reinterpret_cast,
C-style cast or function-style cast

理由がわかりません。以下は正常にコンパイルされるため、typedef の使用とは関係がないことを確認しました。

typedef void* MyType;
int foo;
MyType bar = &foo;

任意のオブジェクトのアドレスを に割り当てることを妨げているのは何HWNDですか?

私がこれをやりたい理由は、そもそも誰かがそれをやろうとしていることに反対した場合に備えて、私がテストできる既知の値を s にHWND提供することによって単体テストしたい s を含むいくつかのコードを持っているからですHWND.

4

3 に答える 3

8

STRICTコンパイル中にが定義されている場合、anHWNDは。ではなくダミー構造体へのポインタとして定義されますvoid*

追加された理由の1つはSTRICT、コンパイラーが実行したい種類の暗黙的な変換をキャッチできるようにすることでした(そして多くの人は実際にはキャッチしませんでした)。実際には「緩いチェック」が必要なので、それSTRICTが定義されていないことを確認してください。

または単にキャストします。

(リンクするMSDNドキュメントページのyic81によるコメントは、更新が必要であることを示していることに注意してください)

于 2013-01-12T19:52:57.797 に答える
2

試す

int foo;
HWND bar = (HWND)&foo;
于 2013-01-12T19:56:28.937 に答える
0

long longにキャスト可能であることがわかりましたHWND

long long llHwnd = 133282;
HWND hwnd = (HWND)llHwnd;

元の回答が見つかったら、元の回答へのリンクを含めます。

于 2020-09-20T12:32:21.820 に答える