1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

64bitアプリでの WM_DROPFILESメッセージのバグについて

Posted at

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 );
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?