4

x64 ターゲット ビルドで 'OLE_HANDLE' から 'HICON' にキャストする適切な方法は何ですか?

特に、通常の C スタイルのキャストでは、x64 構成でコンパイルすると、次の警告が表示されます。

警告 C4312: '型キャスト': 'OLE_HANDLE' からより大きなサイズの 'HICON' への変換

問題のあるコードは次のとおりです。

imgList.Add((HICON)ohIcon);

上記のコードは私にとっては問題なく動作しますが、x64 用にビルドするときの警告を取り除きたいです。

4

5 に答える 5

6

H はそれを与えます。この場合、ライブラリ コードは、(古い C API の時代に) 型の安全性をもう少し高めるために個別の型を作成しました。

これらは実際には両方とも HANDLE です。これは、リソースが何であるかをあまり気にしないカーネル オブジェクトであり、「ハンドル」を持っているだけです。API は C のものであるため、C スタイルのキャストを使用し、削除する場合は DeleteObject() を使用します。

編集:64ビットええと...問題は、MSがハンドルを64ビットに更新したが、OLEのものをそのままにしたためです。幸いなことに、彼らが行ったのは余分なビットをゼロで埋めることだけでした。

LongToHandle 変換ルーチンを使用してみて、 MIDL 移植ガイドを参照してください。「USER ハンドルと GDI ハンドルは 32b 値に署名されています」セクションまでスクロールします。

于 2008-12-30T23:53:01.153 に答える
4

質問に基づいて Microsoft Visual Studio を使用していると仮定します...

32 ビット ターゲットのみを対象として開発している場合は、プロジェクト オプションの [ 64 ビットの移植性の問題を検出する] (C++ コンパイラ オプション /Wp64) をオフにすることで、これ (および他の同様の警告) を無効にすることができます。

64 ビット ターゲットも開発している場合、@Harper はおそらく正しいので、これを処理する正しい方法をさらに掘り下げる必要があります。このホワイト ペーパーを出発点として読むことをお勧めします。USER ハンドルと GDI ハンドルに関するセクションに進んでください。

于 2008-12-31T05:18:21.980 に答える
1

私は少し掘り下げました - OLE_HANDLE は unsigned long のようで、HICON は void* です。32 ビット Windows ではこれらは同じサイズですが、Windows x64 では void* は 64 ビットです。このキャストを行う安全な方法はありません。余分な 32 ビットは未定義です。残念ながら、ULONG (OLE_HANDLE はさらにまれな獣です) に関して掘り下げることができた唯一のアドバイスは、単純に「これをポインターにキャストしないでください」というものでした。

于 2008-12-31T03:37:04.960 に答える
1

それらの間でキャストする「適切な」方法に対する「正しい」答えは、「そうしないでください」であると思います。確かに、それはあまり役に立ちません... そもそも OLE_HANDLE はどこから来ているのでしょうか? どこでも HICON を使用するには、OLE_HANDLE を使用してコードを書き直す必要があるようです。

于 2008-12-31T14:14:43.693 に答える
0
HICON hSomeIcon = (HICON) hSomeOLEHandle;

つまり、交換可能です。

于 2008-12-30T23:40:53.113 に答える