none
WinPEで実行するMFCプログラムでSHBrowseForFolder()関数に失敗する RRS feed

  • 質問

  • お世話になります。

    WinPE3.0上で実行するプログラムをVS2008で開発しています。
    スタティックライブラリでMFCを使用するUnicode対応の64bitプロジェクトです。

    フォルダー選択メニューを使いたくてSHBrowseForFolder()関数をコールするのですが、WinPEで実行させてもフォルダー選択ダイアログが表示されず関数がNULLを戻します。Windows7上では問題なく動作しています。
    COMの初期化が必要ということでCoInitialize()、CoUninitialize()を入れましたが効果ありません。VS2012でも同じです。

    どうぞよろしくお願いします。

    2013年5月14日 6:49

回答

  • PE については詳しくないのでわからない部分も多々ありますが、PE 3.0 環境は、SHBrowseForFolder API をサポートしているのでしょうか?

    代替というわけではありませんが、Vista 以降の環境では、SHBrowseForFolder ではなく、IFileDialog で FOS_PICKFOLDERS オプションを使ってほしいとリファレンスにあります。

    どちらもシェル周りの機能なので、PEのサポート範囲内なのかわからないのですが、こちらも検討してみてはいかがでしょうか?


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答の候補に設定 星 睦美 2013年5月16日 2:46
    • 回答としてマーク 星 睦美 2013年5月20日 5:32
    2013年5月14日 8:42
  • PEはあまり詳しくありません。あしからず。
    Windows7とPE3は構築の組み合わせによっては同等に動作しますが、
    一般論としては、完全に互換ではありません。
    SHBrowseForFolder()を動作させるために必要なコンポーネントが
    全て組み込まれているか、PE3を調査してみる必要があると考えられます。
    大昔の話で申し訳ありませんが、WindowsXp-EMBの場合には
    エクスプローラシェル(コモンコントロールを含む(多分ツリーCtrlのため))が必要だったと記憶してます。
    2013年5月14日 9:05

すべての返信

  • PE については詳しくないのでわからない部分も多々ありますが、PE 3.0 環境は、SHBrowseForFolder API をサポートしているのでしょうか?

    代替というわけではありませんが、Vista 以降の環境では、SHBrowseForFolder ではなく、IFileDialog で FOS_PICKFOLDERS オプションを使ってほしいとリファレンスにあります。

    どちらもシェル周りの機能なので、PEのサポート範囲内なのかわからないのですが、こちらも検討してみてはいかがでしょうか?


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答の候補に設定 星 睦美 2013年5月16日 2:46
    • 回答としてマーク 星 睦美 2013年5月20日 5:32
    2013年5月14日 8:42
  • PEはあまり詳しくありません。あしからず。
    Windows7とPE3は構築の組み合わせによっては同等に動作しますが、
    一般論としては、完全に互換ではありません。
    SHBrowseForFolder()を動作させるために必要なコンポーネントが
    全て組み込まれているか、PE3を調査してみる必要があると考えられます。
    大昔の話で申し訳ありませんが、WindowsXp-EMBの場合には
    エクスプローラシェル(コモンコントロールを含む(多分ツリーCtrlのため))が必要だったと記憶してます。
    2013年5月14日 9:05
  • アドバイスありがとうございます。

    IFileDialogでもダメでした。CoCreateInstance()でエラーが戻ってきます。

    WinPEでこの関数がサポートしていると思うのは、GIMAGEXというプログラムがWEB上にありますが、これではSHBrowseForFolder()関数を使っていそうで、正常に表示されていることからです。

    何か忘れているのでしょうね?

    2013年5月15日 10:15
  • フォーラム オペレーターの星 睦美です。

    私のほうでもWindows PE に関する情報を探してみたところ、以下のTechNet マガジンの記事がありました。

    デスクトップ ファイル - Windows PE を拡張する:

    (抜粋)"しかし、私たちは、当初からシェルを抑制することを考えていました。私たちは、従来の Windows エクスプローラ シェルではなく cmd.exe を使用することにより、Windows PE 環境が実行できることを制限しました。"

    とっちゃん さんと中澤@失業者 さんの返信にもシェルの機能が必要と書かれていますね。

    また、上記で[Figure 1 不足している Windows API] にはエクスプローラも含まれていますので、Windows PE は通常ではフォルダーを参照することができないのですね。

    私はこれ以上の情報を見つけることはできませんでしたが、こちらの情報がmne さんの質問を解決する何かてがかりになればと思います。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年5月16日 2:44