none
VisualStudio2008のリソースデータのキャッシュについて。 RRS feed

  • 質問

  • こんにちは。

    VisualStudio2008のVisualC++でMFCのプログラムを書いています。
    アイコンなどのリソースについてですが、カスタムリソースを埋め込んでいます。
    そのデータは独自のデータで、データを更新した場合、カスタムビルド規則 で
    独自のコマンドツールでビルドして出力されたデータをカスタムリソース
    として利用しています。

    データを更新→カスタムビルド まではうまくいっているのですが、
    実際の実行ファイルに埋め込まれるときに、更新される前のデータが
    埋め込まれてしまいます。リビルドすると最新のデータが埋め込まれます。

    アイコン等をエクスプローラから直接ファイルを上書きした場合は
    VisualStudioがキャッシュしてしまっているので古いデータで
    上書きしてしまうのは体感的に知っていますが、同様の現象だと
    思います。

    ツールビルド順序の設定はリソースコンパイラツールよりは前に
    設定されているので、やはりVisualStudioがリソースデータを
    キャッシュしてもっているのが原因ではないか思います。

    リソースを外部ツールで更新してもきちんと反映されるようにする方法は
    ないものでしょうか? またはVisualStudioがリソースをキャッシュさせない
    方法はないのでしょうか?

    もしご存じの方がいらっしゃいましたら教えていただけないでしょうか。
    よろしくお願いします。

    2009年3月27日 6:23

すべての返信

  • ビルドログ(BuildLog.htm)にはどのようなコマンドを実行したのか、順序や引数が書かれています。
    それを参照し、意図通りの動作をしているか確認してみて下さい。
    読むとわかると思いますが、Visual Studioはそれぞれのコマンドを実行しているだけでキャッシュには関与していません。
    たぶん実行順序が意図していない状態になっていると思います。
    2009年3月28日 5:07
  • 佐祐理 様、レスありがとうございます。

    ビルドログを確認したところ、

    1>------ すべてのリビルド開始: プロジェクト: ******, 構成: Debug x64 ------
    1>プロジェクト '******'、構成 'Debug|x64' の中間出力ファイルを削除しています。
    1>ビルド前のイベントを実行しています...

    1>ツール関係のログ
        ...
        ...
        ...

    1>リソースをコンパイルしています...
    1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
    1>Copyright (C) Microsoft Corporation.  All rights reserved.
    1>リンクしています...
    1>マニフェストを埋め込んでいます...
    1>ビルドログは "*****\Debug\BuildLog.htm" に保存されました。
    1>***** - エラー 0、警告 0
    ========== すべてリビルド: 1 正常終了、0 失敗、0 スキップ ==========

    上記のような感じで、リソースコンパイル前に実行しているようです。
    もしかしたら解釈が間違っているかもしれませんので、もう少し調べてみたいと思う増す。

    2009年3月30日 0:50
  • 1>ビルドログは "*****\Debug\BuildLog.htm" に保存されました。

    ですからこのBuildLog.htmを確認してください、と書いたのですが…。
    2009年3月30日 0:55

  • 佐祐理 様、早々のレスありがとうございます。

    BuildLog.htm には大きく3つに分かれていて、

    コマンド ライン
    出力ウィンドウ
    結果

    となっていました。
    出力ウィンドウと結果については、先程書いたとおりの内容で、コマンド ラインには先頭に

    一時ファイル "****\Debug\BAT00004E34282576.bat" を作成しています。内容 :
    [
    @echo off

    ****ツールのコマンド

    if errorlevel 1 goto VCReportError

    goto VCEnd

    :VCReportError

    echo Project : error PRJ0019: ツールはエラー コードを返しました : "****"

    exit 1

    :VCEnd
    ]

    という独自ツールのコマンドの内容が書かれており、その後に

    コマンド ライン """****\Debug\BAT00005134282576.bat""" を作成しています。
    コマンド ライン "rc.exe /d "_UNICODE" /d "UNICODE" /l 0x411 /fo"x64\Debug/****.res" "..\****.rc"" を作成しています。
    一時ファイル "****\Debug\RSP00005234282576.rsp" を作成しています。内容 :
    [
    /OUT:"****\bin\****.exe" /INCREMENTAL:NO /DLL /MANIFEST /MANIFESTFILE:"x64\Debug\****.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /NODEFAULTLIB /NOENTRY /DYNAMICBASE /NXCOMPAT /MACHINE:X64 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

    ".\x64\Debug\****.res"
    ]
    コマンド ライン "link.exe @"****\Debug\RSP00005234282576.rsp" /NOLOGO /ERRORREPORT:PROMPT" を作成しています。
    一時ファイル "****\Debug\RSP00005334282576.rsp" を作成しています。内容 :
    [
    /outputresource:"..\..\..\bin\****.exe;#2" /manifest

    ".\x64\Debug\****.exe.intermediate.manifest"
    ]
    コマンド ライン "mt.exe @"****\Debug\RSP00005334282576.rsp" /nologo" を作成しています。
    一時ファイル "****\Debug\BAT00005434282576.bat" を作成しています。内容 :
    [
    @echo マニフェスト リソースの最終更新日時: %TIME% (%DATE%) > ".\x64\Debug\mt.dep"
    ]
    コマンド ライン """****\Debug\BAT00005434282576.bat""" を作成しています。

    というようなリソース関係のバッチ作成の記述がされていました。
    リソース関係のコマンドについては全然分かりませんので、調べてみたいと思います。

    2009年3月30日 2:56
  • 自己レスです。結論としては解決しませんでした。

    VisualStudio 2008 でリソースビューで内容を表示させた状態で、対象のカスタムリソースのファイルを削除しても、リソースビューからカスタムリソースの内容が表示されてしまいますのでキャッシュされているのは間違いなさそうです。リンク時もその内容のものが使われていました。

    なんなかの方法で内容をリフレッシュされれば問題ないと思うのですが、その方法が分かりませんでした。

    時間があるときに、解決方法を探したいと思います。
    2009年4月8日 4:04
  • ちなみにVisual Studioのリソースビューが作成するキャッシュは.apsファイルでBuildLog.htmには現れていない=ビルドには使用されていないことがわかると思います。
    コマンド ライン "rc.exe /d "_UNICODE" /d "UNICODE" /l 0x411 /fo"x64\Debug/****.res" "..\****.rc"" を作成しています。
    .. \****.rc」が気になりました。異なる.rcファイルを参照していませんか?
    普通.rcファイルはプロジェクトディレクトリに置きますので「. \****.rc」となるはずですが、これではプロジェクトディレクトリの1階層上(ソリューションディレクトリ)を指しています。
    ソリューションエクスプローラで当該ファイルを選択し、F4 プロパティウィンドウを開いて下さい(右クリック→プロパティではありません)。そこに書かれている完全パスは意図したファイルを指していますか? 異なる場合は相対パスを編集しましょう。

    違うとすると、ビルド後に.rcファイルが正しく更新されているかをメモ帳などで確認してみて下さい。
    また実行ファイルに埋め込まれているリソースが本当に古いものなのかをリソースエディタで確認してみて下さい。
    2009年4月8日 4:54
  • 佐祐理 様、早々のレスありがとうございます。

    「..\****.rc」が気になりました。異なる.rcファイルを参照していませんか?

    についてですが、デフォルトでプロジェクトを作成すると、

    ソリューションフォルダ
      + プロジェクトフォルダ
        + ****.rc
        + resource.h

    になりますが、仕様で

    ソリューションフォルダ
      + ****.rc
      + resource.h
      + プロジェクトフォルダ

    というように、プロジェクトフォルダより上にあるため、..\****.rc というログが出てきてしまいます。
    誤解を招くようなことをしてしまい申し訳ありません。

    2009年4月15日 10:55