質問

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

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

警告C4312: 'type cast':より大きなサイズの 'OLE_HANDLE'から 'HICON'への変換

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

imgList.Add((HICON)ohIcon);

上記のコードは正常に機能しますが、x64用にビルドするときの警告を取り除きたいです。

役に立ちましたか?

解決

Hはそれを解放します。この場合、ライブラリコードは、(古いC APIの時代に)もう少しタイプセーフティを提供するために特殊タイプを作成しました。

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

edit:64ビットeh ... MSはHandlesを64ビットに更新しましたが、OLEの部分はそのままにしていたためです。幸いなことに、彼らがしたことは、余分なビットをゼロで埋めることだけでした。

LongToHandle変換ルーチンを使用してみてください MIDLポーティングガイドを参照してください。 ; USERおよびGDIハンドルは符号拡張32b値です。セクション。

他のヒント

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

32ビットターゲット専用に開発している場合、プロジェクトオプション" 64ビットの移植性の問題を検出する" (C ++コンパイラオプション/ Wp64)。

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

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

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

HICON hSomeIcon = (HICON) hSomeOLEHandle;

i.e。交換可能です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top