リソースファイルの中身が書き変わってしまう

回答済み リソースファイルの中身が書き変わってしまう

  • 2012年4月28日 9:24
     
     

    いつもお世話になっております。2つほどご教示いただきたいことがあります。(返事は特に急ぎません)

    リソースファイルに何か異変?が起きているようです。もしかしたら、プロジェクト名を変更したことに何か関係があるのかどうかという気がするのですが、そのあたりのことをお教え頂ければ幸いです。

    visual studio 2008 MFC ダイアログベースを使っています。

    これは、自分で作っているプロジェクトにあるリソースファイルの一部です。ファイル名は、RenameMyProjectName.rcです。

    3 TEXTINCLUDE
    BEGIN
        "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
        "#define _AFX_NO_OLE_RESOURCES\r\n"
        "#define _AFX_NO_TRACKER_RESOURCES\r\n"
        "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
        "\r\n"
        "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)\r\n"
        "LANGUAGE 17, 1\r\n"
        "#pragma code_page(932)\r\n"
        "#include ""res\\BeforeMyProjectName.rc2""  // Microsoft Visual C++ 以外で編集されたリソース\r\n"
        "#include ""l.JPN\\afxres.rc""      // 標準コンポーネント\r\n"
        "#endif\r\n"
        "\0"
    END

    上記の中にある

      "#include ""res\\BeforeMyProjectName.rc2""  // Microsoft Visual C++ 以外で編集されたリソース\r\n"

    の部分です。

    じつは、このままの状態でビルドするとエラーが出ます。ビルドが通らないのは、ファイルパスが間違っていることが理由だったことは想像がついたので

    "#include ""BeforeMyProjectName.rc2""

    と書き変えるとビルドが通るようになりました。

     ただ、自分でこれら二つのリソースファイルを書き変えたり、ファイルの場所を移動したりしたことはありません。また、この現象が発生する少し前に、プロジェクト名の変更作業を行っており、その暫く後に、この現象が出始めました。つまり、プロジェクト名を変更した直後はビルドエラーは出なかったのですが、プロジェクト名の変更を行い、継続してプログラムの変更/追加の作業を続行して(当然、ビルドも日々やっていた)やっているうちに、どうも書き変わってしまったようです。修正しても、しばらくするとまた同じビルドエラーが出て、当然ながら修正すればとビルドエラーは消えます。

     もちろん、私が自分でこのファイルを書き変えた覚えはありません。(というか、このエラーが出るまでテキストエディタなどで、開いたこともありません)上記の引用のBeforeMyProjectName.rc2のファイル名の部分は実はプロジェクト名変更前のプロジェクト名です。

    プロジェクト名の変更作業は開発環境にあるプロジェクト名を右クリックして行う方法でやりました。

    1.このように勝手に参照先が書き変わってしまうようなことがあるのでしょうか?あるとすれば、何か理由やその対策はありますか?修正してもまた同じ現象が出る(=修正しても同じ個所が書き変わってしまう)というのも不可解です。

    2.引用部分には、

    // Microsoft Visual C++ 以外で編集されたリソース\r\n"

    というコメントが付いています。これは、どういうことでしょうか?もちろん、私がVisual stuidio意外のツールなどで編集したことはありません。(もちろん、visual studio を使って直接、rcファイルやrc2ファイルを変更したことはありません)プロジェクト名を変更しているのに、変更前のプロジェクト名が付いたリソースファイルが残っていることも不思議です。

    よろしくお願いします。

すべての返信

  • 2012年4月28日 12:46
    モデレータ
     
     

    ビルドが通らない状態のファイル名と、ビルドが通るように変更した後のファイル名を正しく書き表せていますか?
    ディレクトリ名 res の有無だけでビルドできる・できないが変わりますか?

    ビルドが通らなくなるのはリソースエディタで触った後ではないでしょうか。

    1.前のプロジェクト名に置き換わるのであれば、どこかで前のプロジェクト名が保持されているのでしょうから、それを見つけるか、rc2 のファイル名を変えれば(元に戻せばになるのかな?)よいでしょう。
    2.新しいプロジェクト名に置き換わるのであれば、rc2 のファイル名も合わせればよいだけでしょう。
    3.res の有無が変化してビルドが通らなくなるのであれば、rc2 ファイルを自動生成(勝手に変更されるパス)に移動したら回避できませんか。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

  • 2012年4月29日 1:38
     
     

    プロジェクト名などの名称変更等による挙動は、昔からよくわかりません。

    1.については、どこかに情報が残っているはずとしか考えようがありません。昔経験したのは、プリコンパイルヘッダー等に情報が残り悪さをしていました。オブジェクト等をすべて手作業でバッサリ削除すると問題が無くなりました。が、こうしてもダメな時も経験しており、新しいプロジェクトを新規作成し、新しいソースファイル名も新規作成し(プロジェクトのスケレトンを作るような感じ)、そしてソースコードを手作業で転写するという、強引な手段を用いました。これにより解決したので、プロジェクトファイルそのものに情報が含まれている(もしかしたらVS上で変更できない部分)のではないかと推測しています。

    2.は、新規作成した時点で「// Microsoft Visual C++ 以外で編集されたリソース\r\n"」というコメントが付きます。なぜ自動生成で付くのかは分かりませんが、仕様なのでしょう。

  • 2012年4月29日 3:05
     
     

    Azuleanさん、いつもありがとうございます。

    >ビルドが通らない状態のファイル名と、ビルドが通るように変更した後のファイル名を正しく書き表せていますか?
    >ディレクトリ名 res の有無だけでビルドできる・できないが変わりますか?

    はい。変わります。ファイル名は変更せず、res\\ を消す作業だけですので、ファイル名の表記も間違っていないと思います。


    >ビルドが通らなくなるのはリソースエディタで触った後ではないでしょうか。

     ビルドエラーが出る直前の作業を正確に記憶しているわけではないですが、おそらく触っていると思います。
    (コントロールの大きさ変更や位置変更など、日々、触っていますので)


    >1.前のプロジェクト名に置き換わるのであれば、どこかで前のプロジェクト名が保持されているのでしょうから、それを見つけるか、rc2 のファイル名を変えれば(元に戻せばになるのかな?)よいでしょう。

    ここでいう、「どこか」というのは、rcファイルとrc2ファイルの中と言うことで良いでしょうか?それとも、BlueSkyColors さんの回答にあるような内容も含めた、プロジェクト全体にある色々なファイルのどこかを指していますか?

    >2.新しいプロジェクト名に置き換わるのであれば、rc2 のファイル名も合わせればよいだけでしょう。
    上記、1番のほうですので、今回はこちらのほうは関係なさそうです。


    3.res の有無が変化してビルドが通らなくなるのであれば、rc2 ファイルを自動生成(勝手に変更されるパス)に移動したら回避できませんか。

    済みません、言葉が分からないのですが、「自動生成(勝手に変更されるパス)」というのは、どこを言っていますか?

  • 2012年4月29日 3:09
     
     

    BlueSkyColors さん、ありがとうございます。

    >プロジェクト名などの名称変更等による挙動は、昔からよくわかりません。

    そういうものだったのですね。昔からある現象だと言うことなら、ちょっと安心しました。

    >1.については、どこかに情報が残っているはずとしか考えようがありません。昔経験したのは、プリコンパイルヘッダ>ー等に情報が残り悪さをしていました。オブジェクト等をすべて手作業でバッサリ削除すると問題が無くなりました。

    >プロ>ジェクトのスケレトンを作るような感じ)、そしてソースコードを手作業で転写するという、強引な手段を用いまし

    >た。これではないかと推測しています。

    奥底にまで入り込んでしまうと、完全に修正するのは無理そうですね。

    今回の私のプログラムでは、ダイアログベースで、そこにコマンドボタンなどのコントロールをたくさんつけています。こういうものを、IDの値を揃えるなどして同じコントロールを含むダイアログも全部作りなおすということでしょうか?

    >2.は、新規作成した時点で「// Microsoft Visual C++ 以外で編集されたリソース\r\n"」というコメントが付き

    >ます。なぜ自動生成で付くのかは分かりませんが、仕様なのでしょう。

    そういうことでしたか。安心しました。

  • 2012年4月29日 6:53
     
     

    今回の私のプログラムでは、ダイアログベースで、そこにコマンドボタンなどのコントロールをたくさんつけています。こういうものを、IDの値を揃えるなどして同じコントロールを含むダイアログも全部作りなおすということでしょうか?

    ・Wizardを使えばリソース(rc)ファイルも新規作成されているはずです。それで新規作成したリソースと既存のリソースを「コードの表示」で両方とも表示させ、コード全体を丸ごとコピー&ペーストすれば大丈夫です。もちろん問題となる部分が含まれてた場合は手作業で修正しなければなりませんが。
    ・アイコン等の場合は、ファイルをプロジェクトに追加します(「既存の項目」で指定する)。

    以上が私がやった方法です。

  • 2012年4月29日 10:09
     
     

    ・Wizardを使えばリソース(rc)ファイルも新規作成されているはずです。それで新規作成したリソースと既存のリソースを「コードの表示」で両方とも表示させ、コード全体を丸ごとコピー&ペーストすれば大丈夫です。もちろん問題となる部分が含まれてた場合は手作業で修正しなければなりませんが。
    ・アイコン等の場合は、ファイルをプロジェクトに追加します(「既存の項目」で指定する)。

    以上が私がやった方法です。

    BlueSkyColorsさん、ありがとうございます。

    試してみます。

  • 2012年4月29日 10:50
    モデレータ
     
     

    ここでいう、「どこか」というのは、rcファイルとrc2ファイルの中と言うことで良いでしょうか?それとも、BlueSkyColors さんの回答にあるような内容も含めた、プロジェクト全体にある色々なファイルのどこかを指していますか?

    Visual C++ が作成・管理するファイル群のどこかです。
    ユーザーが認識しうる場所かどうかはわかりませんが、あえて追いかける必要性はないと思っています。
    (追いかけなくても解消できると見込んでいるため)

    というか、私の3つの中では、1じゃなくて3に該当するように見えますよ。

    3.res の有無が変化してビルドが通らなくなるのであれば、rc2 ファイルを自動生成(勝手に変更されるパス)に移動したら回避できませんか。

    済みません、言葉が分からないのですが、「自動生成(勝手に変更されるパス)」というのは、どこを言っていますか?

    「res\\ を消す作業だけです」であれば、この3に当てはまります。
    「自動生成するパス」とは、「res\\BeforeMyProjectName.rc2」のことです。あなた方が認識しない時点で勝手に書き換わるのですから、自動生成と表現しています。

    さて、「res\\」を消せばコンパイルが通るのであれば、プロジェクトフォルダーに「BeforeMyProjectName.rc2」があるのですよね。プロジェクトフォルダーに「res」フォルダーを作り、「res」フォルダーに「BeforeMyProjectName.rc2」を移動すれば、勝手に書き換わっても問題なくなるのでは。

    なお、ウィザードで新規にプロジェクトを作ると、rc2 ファイルは res フォルダーにできます。それを移動してしまったので問題が発生しているのではないでしょうか。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

  • 2012年4月29日 13:29
     
     回答済み

    手順を整理しました。VS2005です。

    ・Wizardで(MFCアプリの)MFCResNameCheckを作成
    ・VS上でMFCResNameCheck.rcの名前をMFCResName2Check.rcにする
    ●この時点でソリューションのビルド成功、実行も確認。これは期待通り。
    ・VS上でのMFCResRenameCheck.rc2名前をMFCResRename2Check.rc2にする
    ●この時点でソリューションのリビルド、失敗。エラーは
      1>.\MFCResRename2Check.rc(389) : fatal error RC1015: cannot open include file 'res\\MFCResRenameCheck.rc2'.
     MFCResRename2Check.rcは、res\\MFCResRenameCheck.rc2という記述のままであり、実際のファイルはres\MFCResRename2Check.rc2になっているので、このエラーは正しい。そしてこれによりVSは、Wizardで生成したMFCResNameCheck.rcの内容を自動的に更新しないことが分かる。
    ・VS上で"#include ""res\\MFCResRenameCheck.rc2""を"#include ""res\\MFCResRename2Check.rc2""に手作業で修正し、かつ、VS上で表示したままにする。
    ●この時点でソリューションのリビルドし、失敗。エラーは
      1>.\MFCResRename2Check.rc(389) : fatal error RC1015: cannot open include file 'res\\MFCResRenameCheck.rc2'.
     となっている。修正したはずなのにエラーが発生する。VS上の表示は修正後のままで正しい。エススプローラーでres\MFCResRename2Check.rcをエディタで開いても"#include ""res\\MFCResRename2Check.rc2""となっていて正しい。

    ソースの一番下に、実際のインクルード
      #include "res\\MFCResRenameCheck.rc2"  // Microsoft Visual C++ 以外で編集されたリソース
    があります。しかし
      // TEXTINCLUDE 3 リソースから生成されました。
    というところなので"#include ""res\\MFCResRename2Check.rc2""という手作業の修正でこの部分は自動修正してもよさそうなのですが、しません。
    もちろん、
     #include "res\\MFCResRenameCheck.rc2"  // Microsoft Visual C++ 以外で編集されたリソース

     #include "res\\MFCResRename2Check.rc2"  // Microsoft Visual C++ 以外で編集されたリソース
    にすると、ビルドは成功しますが。

    厄介なことに、さらにそのまま続けて

    ●プロジェクトのリビルドを実行、res\\MFCResRename2Check.rcが自動的に修正され
      #include "res\\MFCResRenameCheck.rc2"  // Microsoft Visual C++ 以外で編集されたリソース
     となる。そして失敗、エラーは
      1>.\MFCResRename2Check.rc(389) : fatal error RC1015: cannot open include file 'res\\MFCResRenameCheck.rc2'.
     になる。実ファイル名は異なるので、このエラーはある意味正しいが、VS上はMFCResRename2Check.rc2なので、手作業の結果が反映されていない。
    ・あらためてres\\MFCResRename2Check.rcを'res\\MFCResRenameCheck.rc2'修正。
    ●ビルドし、今度は成功。

    とまぁ、成功しはするのですが、今度は
      // TEXTINCLUDE 3 リソースから生成されました。
    という部分が自動で再度生成されてしまいます。これは、ある意味で期待通りではあるのですが、逆に、いつ変わるのかが分かりません。それなら、両方同時に修正すればいいのではないか、ということにはなるのですが、そう考えるとしても今度は
      "#include ""res\\MFCResRename2Check.rc2""  // Microsoft Visual C++ 以外で編集されたリソース\r\n"
    の部分が、いつどう変わるのか、生成ロジックが分からないので不安が残ります。

    ともかく、気を取り直して上記をWizardからもう一度試すと、今度はプロジェクトのリビルドをしてもres\\MFCResRename2Check.rcが自動的に修正されず、状況に変化なし、となります。再現性があるとは言いにくいです。これからさらに追跡調査をするには、その労力を考えると、もはや、やってられません。それで私は、強引な手段を取りました。

    確かに、ファイルのフォルダ移動(AnalogTerebi様はフォルダ移動はさせていないそうですが)によるエラーは副産物的な問題であってファイルを元に戻すと解決できるかもしれませんが、それは【動かせない/変更できない】というのと同義です。

    AnalogTerebi様の状況とは全く違うと言われればそれまでですが、適切に修正しているはず(正確には、私がそういう認識でいるという意味ですが)なのに、解決できません。経験的にこうした名称を変更すると期待した通りに動作しないことがあるので、AnalogTerebi様には前述のような説明をしました。

    理路整然と原因と対処方法を説明してくれると、本当にうれしい・・・。だれか教えてくれないかな・・・。


    • 編集済み BlueSkyColors 2012年4月29日 14:08 「前述のようなアドバイス」を「前述のような説明」に修正。アドバイスと言えるような代物ではないので。
    • 回答としてマーク AnalogTerebi 2012年5月1日 14:29
    •  
  • 2012年5月1日 14:38
     
     

    BlueSkyColorsさん、ありがとうございます。

    今日は、

    「名前変更前のプロジェクト名がどこかに残っている」

    というあたりの検討をして、それらしいところを見つけたので、新しいプロジェクト名に変更しました。

    その後、いまのところビルドエラーなどが出なくなったため、BlueSkyColorsさんが詳細に書いていただいた手順は、まだ試していません。

    大人しく?動いているときに、下手にいじるのは怖いので、今後、現象が出たときにこの手順を実験させていただきたいと思います。

    せっかく情報を頂いたのに、済みません。

  • 2012年5月2日 6:32
     
     

    リソースビューの、xxxx.rc を右クリックして、メニューから「リソースファイルのインクルード」を選ぶと、

    ダイアログの中の下の方に、「コンパイル時に追加するファイル(C)」と言う個所に、#include "res\xxxx.rc2" があります。

    .rcファイルを直接編集するのではなく、「リソースファイルのインクルード」の設定から編集するのが良いと思います。

    補足:

    resource.h の値を編集する時も、リソースビューの、xxxx.rc を右クリックして、メニューから「リソースシンボル(O)」を選んで

    編集するのが本来なのでしょうね。いつもresource.h を直接編集しちゃったりしますけど。


    Sorry, I am not good at English.

  • 2012年5月2日 12:50
     
     

    FC-Shiroさん、ありがとうございます。

    .rcファイルを直接編集するのではなく、「リソースファイルのインクルード」の設定から編集するのが良いと思います。

    全然、知りませんでした。今度からは、この方法でやるようにします。

    resource.h の編集も、私も直接テキストエディタで編集していました。