none
起動時にMRUが表示されない RRS feed

  • 質問

  • XP上のVC++2005で作成したSDIアプリをVista上のVC++2008でビルドし直したところ、起動時にMRUが「最近使ったファイル」と表示されます。そのまま「開く」でファイルを開いていくとMRUは追加されていきますが終了後に再度起動すると「最近使ったファイル」とだけ表示されます。

    不思議なことにXPマシンにインストールすると正常に表示されますし、VC++2005で作成したものをVistaにインストールしても問題有りません。

     

    解決方法をご教示下さい。

     

    2008年9月4日 7:34

回答

  • このMRUの実装はMFC標準のものですか?

    MFC標準のものであれば、HKEY_CURRENT_USERで書いているのでこの現象は起きなさそうなのですが…。

     

    独自の実装であれば、レジストリのHKEY_LOCAL_MACHINEやシステムドライブのProgram Files、Windowsフォルダには設定を書かないようにしましょう。

    VC2005ではVista対応のマニフェストが存在しないため、VirtualStoreという仕組みで別の場所にリダイレクトを行うことで正常に書けたかのように振る舞いますが、VC2008ではVista対応のマニフェストが設定されるため、この仕組みが働きません。

    もし、このような事情があるのであれば、UAC関連についてお調べいただき、適切な場所に保存するように修正して下さい。

    2008年9月4日 14:53
    モデレータ
  •  村尾DOS さんからの引用

    単純なミスで、InitInstance内のSetRegistryKey(()が削除されていました。

    なぜXPまでの環境下で動いていたのか不思議ですが暫く様子を観てみます。

    不思議ではありません。そう言う仕組みです。

    SetRegistryKeyがないのであればiniファイルとしてWindowsフォルダに保存されます。

    http://msdn.microsoft.com/ja-jp/library/cc429779.aspx )

     

    XPまではWindowsフォルダであっても自由に書き込めますが、VistaからはUACという仕組みが入っていますので、WindowsフォルダやProgram Filesフォルダには書き込みができません。

    VC2005までで作成したアプリには互換性のため、Vistaが用意するVirtualStoreの仕組みが働き、あたかもWindowsフォルダに書き込めたように振る舞うことで、iniが正常に読み書きできます。(実際には特定のフォルダにリダイレクトされます)

    しかし、VC2008で作成されたアプリには「Vistaで標準ユーザで動きます」というマニフェストが含まれていますので、VirtualStoreが機能せず、Windowsフォルダには書き込みが失敗し、MRUを保存できません。

     

    http://support.microsoft.com/kb/927387/ja

    2008年10月7日 15:02
    モデレータ

すべての返信

  • このMRUの実装はMFC標準のものですか?

    MFC標準のものであれば、HKEY_CURRENT_USERで書いているのでこの現象は起きなさそうなのですが…。

     

    独自の実装であれば、レジストリのHKEY_LOCAL_MACHINEやシステムドライブのProgram Files、Windowsフォルダには設定を書かないようにしましょう。

    VC2005ではVista対応のマニフェストが存在しないため、VirtualStoreという仕組みで別の場所にリダイレクトを行うことで正常に書けたかのように振る舞いますが、VC2008ではVista対応のマニフェストが設定されるため、この仕組みが働きません。

    もし、このような事情があるのであれば、UAC関連についてお調べいただき、適切な場所に保存するように修正して下さい。

    2008年9月4日 14:53
    モデレータ
  • お世話になります。
    MRUに関しては、CWinApp::AddToRecentFileList をオーバーライドして特定の拡張子をもつファイルのみを表示しているくらいです。
    オーバーライドを止めても同じです。
    2008年9月5日 1:33
  •  

    CRecentFileList クラスを使ってMRUの実装を試みています。

    http://msdn.microsoft.com/ja-jp/library/wkfyf6y5(VS.80).aspx?ppud=4

    これを参考にしているのですが、

    'MRUMacros.h': No such file or directory

    と蹴られてしまいます。

    何か設定が必要なのでしょうか?

    2008年10月5日 6:35
  • 元の現象は心当たりがないため、何とも言えません。

     

     村尾DOS さんからの引用

    http://msdn.microsoft.com/ja-jp/library/wkfyf6y5(VS.80).aspx?ppud=4

    これを参考にしているのですが、

    'MRUMacros.h': No such file or directory

    と蹴られてしまいます。

    「スマート デバイス開発者のためのメモ」セクションですので、通常のMFCアプリケーション開発では使わないものだと思われます。

    また、Visual Studio 2008向けの同ページには記載がないので、誤記か何かのようにも思えますが、その周辺を探ってみても有力な情報に出会えなかったため裏付けは取れていません。

    2008年10月5日 8:09
    モデレータ
  • 解決しました。

    単純なミスで、InitInstance内のSetRegistryKey(()が削除されていました。

    なぜXPまでの環境下で動いていたのか不思議ですが暫く様子を観てみます。

    有り難うございました。

     

    2008年10月7日 2:18
  •  村尾DOS さんからの引用

    単純なミスで、InitInstance内のSetRegistryKey(()が削除されていました。

    なぜXPまでの環境下で動いていたのか不思議ですが暫く様子を観てみます。

    不思議ではありません。そう言う仕組みです。

    SetRegistryKeyがないのであればiniファイルとしてWindowsフォルダに保存されます。

    http://msdn.microsoft.com/ja-jp/library/cc429779.aspx )

     

    XPまではWindowsフォルダであっても自由に書き込めますが、VistaからはUACという仕組みが入っていますので、WindowsフォルダやProgram Filesフォルダには書き込みができません。

    VC2005までで作成したアプリには互換性のため、Vistaが用意するVirtualStoreの仕組みが働き、あたかもWindowsフォルダに書き込めたように振る舞うことで、iniが正常に読み書きできます。(実際には特定のフォルダにリダイレクトされます)

    しかし、VC2008で作成されたアプリには「Vistaで標準ユーザで動きます」というマニフェストが含まれていますので、VirtualStoreが機能せず、Windowsフォルダには書き込みが失敗し、MRUを保存できません。

     

    http://support.microsoft.com/kb/927387/ja

    2008年10月7日 15:02
    モデレータ
  • 詳細なご教示のお陰でようやく理解できました。

    有り難うございました。

     

    2008年10月8日 9:55