|
分類:[C/C++]
お世話になります。
【状況】 OS:Windows 10 x64 1809 開発:VisualStudio 2013、VC++ MFC 目的:Extended Length Pathの、エクスプローラからのD&D実装 問題:パスが正しく取得できない
【詳細】 以下のディレクトリを作成し、エクスプローラからアプリケーションにD&Dしました。
C:\あいうえお05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7\あいうえお05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7
結果、 (1) WM_DROPFILES が発生しない (2) OLEのD&DでならばDropに到達した(※) という状態のため、OLEのクラスを使って実装を試みています。 ところが、上記パスをD&Dすると、
(a)パスがショートネーム化されているが、これをGetLongPathNameで復元できない ショートネーム化されたパスは日本語部分が文字化けしていた。
(b)さらに長いパス(8500文字を超過)を処理しようとすると、IDataObjectのGetData時点で失敗する HRESULTは3 という2つの問題が発生しました。
※IDataObjectにつきましては、OLEの知識が全く無いので、 サイト「窓プログラミング」様の(OLE DragDrop)に 公開されていたソースをUnicode化&x64化した物を使いました。
【質問】 Q1 WM_DROPFILESが発生しない原因は、PreTranslateMessageなど、どこかで特定する方法はあるでしょうか? ※自分が確認した範囲で、PreTranslateMessageにはメッセージが来ていませんでした。 これ以前のメッセージのフローについては勉強不足です。;
Q2 (a)、及び(b)に関して、対策方法はないでしょうか?
存知の方がいましたら、ご教授お願いいたします。 乱文失礼しました。以上、よろしくお願いいたします。
|