none
管理者として起動したVS2005でデバッグするとWM_DROPFILESが発生しない RRS feed

  • 質問

  • MFC VC++で開発しています。
    以前WindowsXP VS-NET2002で開発していたソフトを、事情によりWindowsVista VS2005SP1(forVista)環境へ移行

    しました。

    ところが以前は正常に動作していた、ファイルのドラッグ&ドロップが機能しなくなってしまいました。
    処理内容は一般的(?)なもので、CMainFrameクラスのOnCreate()にてDragAcceptFiles()を起動し、
    OnDropFiles()メッセージハンドラで制御を行うというもので、エクスプローラ等からファイルもしくは
    フォルダをドラッグしてくるものです。

    マウスカーソルはウィンドウ内に入っても変化しているので、ドラッグ中というのは機能しているようですが、ドロップしてもOnDropFiles()が呼ばれません。

    Spy++で見てみるとWM_DROPFILESが発行されていないようです。

    色々調べているうちに、VS2005を起動しないで直接exeを実行(エクスプローラからダブルクリックで起動)
    した場合は正常にドラッグ&ドロップできることがわかりました。

    いつもはVS2005を起動するときは管理者として実行していたので、今度は通常起動して検証してみました。
    するとドラッグ&ドロップは正常に機能しました。

    なんだか釈然としません。(;_;
    MicrosoftはVistaでのVS2005の起動は管理者権限を推奨していて、実際通常起動ではドキュメントエクス
    プローラの表示に時間がかかったり、他にも問題がありそうだし。管理者権限では特定の機能が検証できない
    というのは非常に厳しいです。

    皆さんはこのような現象等ありませんか?
    回避策や、その他の情報があれば、是非教えてください。

    2007年4月23日 10:57

回答

  • とっちゃんさん、回答ありがとうございます。

     

    >エクスプローラを管理者権限でうごかすには、ウィンドウごとに別プロセスで実行する

    >ように設定を変えないとダメです。

    >デフォルトでは、すべてのウィンドウで一つのプロセスになっており、最初のプロセスは、

    >ログオン時にdesktopとして作られてしまいますので。

     

    なるほど、そういうことだったのですね。

    検証した結果、仰る通りドラッグ&ドロップできるようになりました。ありがとうございました。

     

     

     

    2007年4月24日 9:36

すべての返信

  • UIPI がまともに機能しているだけだと思いますがね。

    2007年4月23日 11:47
  •  情報元がどこだったか忘れてしまいましたが、Windows Vista では権限の異なるアプリケーション間のデータ通信(ドラッグ&ドロップも含む)はできなくなっていると思います。Visual Studio を管理者権限で起動したときにファイルをドロップできないのは、エクスプローラーが通常の権限で起動されているためです。(Visual Studio で起動されたアプリケーションは Visual Studio と同じ権限になります。)

     

    2007年4月24日 3:39
  • ちゃっぴさんが書いているとおり、UIPI(権限が上のプロセスにメッセージが送れない機能)が働いています。

    ドロップするソース側も「管理者として実行」すれば大丈夫です。ショートカットのプロパティで設定できるはずなので、デバッグ用は別途ショートカット作って回避してください。

    2007年4月24日 3:41
  • ちゃっぴ さん、オノデラさん、KKamegawaさん、回答ありがとうございます。

    VistaのUACは多少は知っていましたが、UIPIは全く知らなかったのでとても勉強になりました。

     

    >ドロップするソース側も「管理者として実行」すれば大丈夫です。ショートカットのプロパティで設定できるはずなので、

    >デバッグ用は別途ショートカット作って回避してください。

    エクスプローラのショートカットを作成し、管理者として実行してからドラッグ&ドロップしてみましたが、ダメでした。

     

    試しに、Windows付属のメモ帳を管理者権限で起動し、ファイルのドラッグ&ドロップを行ってみましたが、

    エクスプローラの権限が管理者・通常いずれの場合もできませんでした。

    このことから考えると、管理者権限に昇格してしまうとメッセージが受けられない?ことになります。。。(;_;

    2007年4月24日 6:06
  • エクスプローラを管理者権限でうごかすには、ウィンドウごとに別プロセスで実行するように設定を変えないとダメです。

    デフォルトでは、すべてのウィンドウで一つのプロセスになっており、最初のプロセスは、ログオン時にdesktopとして作られてしまいますので。

    設定は、エクスプローラをアクティブにした状態で、ALTキーを押してメニューを出し、ツール-フォルダオプションでフォルダオプションダイアログを表示、表示タブを選んで、一番下から2個目の「別プロセスでフォルダウィンドウを開く」にチェックを入れて、OKすれば完了です。

    チェックを入れた後に起動するすべてのエクスプローラが独立したプロセスで実行されるようになります。

    これで改めて、管理者に昇格して実験してみてください。結果が変わると思いますよ。

    2007年4月24日 7:20
  • とっちゃんさん、回答ありがとうございます。

     

    >エクスプローラを管理者権限でうごかすには、ウィンドウごとに別プロセスで実行する

    >ように設定を変えないとダメです。

    >デフォルトでは、すべてのウィンドウで一つのプロセスになっており、最初のプロセスは、

    >ログオン時にdesktopとして作られてしまいますので。

     

    なるほど、そういうことだったのですね。

    検証した結果、仰る通りドラッグ&ドロップできるようになりました。ありがとうございました。

     

     

     

    2007年4月24日 9:36
  • Vista において UAC とか UIPI とかこの手の制御で結構はまると思うんですが、これらは access token と扱う object の ACL を調べることによりほとんど解決できると思われます。

     

    一応こんなの書いたんで参考にしてください。

     

    Process の TokenIntegrityLevel を簡単に識別する方法

    2007年4月24日 10:04