Win32API アプリのGUIでD&Dを簡単に扱う方法の一つとして WM_DROPFILESメッセージを利用するというのがあります。
しかし、32bitアプリからファイルをD&Dして64bitアプリ上でそのメッセージを処理しようとしても上手く行かないようです(他のパターンなら問題は無いようです)。それについて調べてみたら以下のURL(英語)にて質問と回答があったのでそれについてまとめてみました。
32bitアプリと64bitアプリ間でのD&Dとそれを受け取るWM_DROPFILESメッセージのやりとりについて、
32bitアプリからD&Dして64bitアプリでWM_DROPFILESメッセージを受け取った場合に正しく動作しない問題がある。
どのような問題かというとWM_DROPFILESメッセージのパラメータWPARAMで受け取るHDROPの上位32bitが破壊されていて正しく動作しないとのこと。
対処法としては複数ある
- WM_DROPFILESメッセージの使用を止めてIDropTargetインターフェースを使用する
- インターフェースをごっそり変えるので面倒だが、正しい対処法と言える。
- 破壊された上位32bitを復元する。
- 具体的にはGlobalAlloc関数を利用して得られたポインタの上位32bitが破壊されたポインタと同じとする
- 危険な方法だと言えるが、修正は楽。
- high entropy ASLR を無効にする。
- セキュリティリスクがあるみたい。
- ごめんなさい。自分にはよくわかりませんでした。
自分がこのバグに遭遇した時は、一時的なアプリであった為破壊された上位32bitを復元する方法を以下のコードで対処した。
// HDROP drop
LONG_PTR p = (LONG_PTR)::GlobalAlloc(GMEM_MOVEABLE, 0);
drop = (HDROP)((0xFFFFFFFF00000000 & p) | (0x00000000FFFFFFFF & ((LONG_PTR)drop)));
::GlobalFree( (HGLOBAL)p );