自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
浩二

自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

#1

投稿記事 by 浩二 » 12年前

VS2013のC++のx86とx64のコンソールアプリを作りました。
この時、ひとつのプロジェクトとして、
1. x86 Debug
2. x86 Release
3. x64 Debug
4. x64 Release
が、バッチビルドのメニューから一度に全部構築できるのでたいへん便利でした。
次にx86とx64用それぞれに対して別々のアイコンとバージョン情報を追加しました。
これもできました。
この時、ABCx86.rcとABCx64.rcのように二つのリソースファイルが必要で、
x86をビルドする時とx64をビルドする時で手動で.rcファイルを切り替えねばなりません。
これが面倒なのでIDEから自動的に切り替えたいです。
どのようにしたらできるでしょうか? 
これが知りたいことです。
宜しくお願いします。
------------------
これまでやってみた方法を一つ書きます。
1.x86とx64で共通のABC.rcを作る。
2.プリプロセッサの定義にそれぞれ_x86_と_x64_を書き込み
#ifdef _x86_ などをABC.rcに書き込み条件付きコンパイルを行った。
リソースファイルABC.rcには、入れ子の前処理指令が部分的にしか
機能していないようでうまくいきませんでした。(特にバージョン情報)
一日中やってみたのにうまくできなかったので、全然別の方法を希望します。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

#2

投稿記事 by へにっくす » 12年前

構成マネージャを開いて、
[構成プロパティ]-[ビルドイベント]-[ビルド前イベント]にコマンドラインで指定する方法しか思いつきませんね。
#x86、x64用のrcを作成しておいて、ビルド対象のリソースファイルに上書きするという手段

製品版を持っていないので予測ですが
構成プロパティの下に、C/C++、リンカーと同じ階層で「リソース」はありませんかね?
以下の質問はVS2005での話ですがもし「リソース」があるならチェックしてみてください。
リソースのバージョン情報を分岐させるには?
的外れでしたらすみません。
written by へにっくす

Mana

Re: 自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

#3

投稿記事 by Mana » 12年前

リソースを書き換えてひとつにまとめるのはリソースエディタの自動更新と衝突しそうなので避けたほうが良さそうです。

リソースを2つともプロジェクトに登録しておいて構成ごとに必要ないほうをリソースファイルのプロパティで『ビルドから除外』してやるのが正攻法ではないでしょうかね。

Mana

Re: 自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

#4

投稿記事 by Mana » 12年前

へにっくす氏がリンクしたページでCondition項目に関する記述を見逃してました。
これを利用すればリソースファイルをまとめることもできるのでしょうかね。

こちらの環境はExpressでリソースエディタが付いてないので未確認。

浩二

Re: 自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

#5

投稿記事 by 浩二 » 12年前

へニックスさんありがとうございます。

>>構成マネージャを開いて、
>>[構成プロパティ]-[ビルドイベント]-[ビルド前イベント]にコマンドラインで指定する方法しか思いつきませんね。
>>#x86、x64用のrcを作成しておいて、ビルド対象のリソースファイルに上書きするという手段

VSにこのような機能があるなんて知りませんでした。
なるほどです。
方法が二つあると思います。
バッチファイルを作る。
1.システムコマンドでABC.rcをABCx86.rcまたはABCx64.rcで上書きする。
2.IDE専用のコマンドを調べて、x86,x64毎にABCx86.rcまたはABCx64.rcを
  プロジェクトから削除する、追加するの操作をする。

>>製品版を持っていないので予測ですが
>>構成プロパティの下に、C/C++、リンカーと同じ階層で「リソース」はありませんかね?
>>以下の質問はVS2005での話ですがもし「リソース」があるならチェックしてみてください。

ありました。 でもコンパイル前のリソースファイル(.rc)ではなくて、
コンパイルしたリソースファイル(.res)の設定になっています。

リンク先をこれから読んでみます。

結構ここの掲示板のエディターは使いやすいですね。 うまくできてる!

浩二

Re: 自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

#6

投稿記事 by 浩二 » 12年前

Manaさんありがとうございました。

>>リソースを書き換えてひとつにまとめるのはリソースエディタの自動更新と衝突しそうなので避けたほうが良さそうです。
>>リソースを2つともプロジェクトに登録しておいて構成ごとに必要ないほうをリソースファイルのプロパティで『ビルドから除外』してやるのが正攻法ではないでしょうかね。

わかりました。 頭に入れておきます。

>>へにっくす氏がリンクしたページでCondition項目に関する記述を見逃してました。
>>これを利用すればリソースファイルをまとめることもできるのでしょうかね。

私の日本語版VS2013にはないみたいです。
リンク先の内容は、Condition項目に記述するとできるではなくて、

>>プロジェクトのプロパティ - 構成プロパティ - C/C++ - プリプロセッサ - プリプロセッサの定義
>>にあり,リソースコンパイラ用の物は
>> プロジェクトのプロパティ - 構成プロパティ - リソース - 全般 - プリプロセッサの定義
>>にあります。

ということのようです。これも知らなかったです。

>>こちらの環境はExpressでリソースエディタが付いてないので未確認。

私のVS2013にも付いていません。
リソースファイルは一番簡単なテキストファイルと同じだったと読んだことがあります。
VS2013では、リソースファイルを開こうとすると、
どのエディターで開きますか?とたくさんメニューが出て選択できるようになっています。
私は、ソースコードエディターで開くを選択して読んでいます。

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: 自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

#7

投稿記事 by YuO » 12年前

うわ,7年以上前に回答した記事が参照されてる……。


それはともかく,Visual Studio 2013にもCondition項目は存在しますし,リソースエディタに相当するリソースビューも付属しています。
# Express Editionは除く。

まず,リソースファイルを追加するとリソースビューにファイルが追加されます。
そして,リソースビューでリソースを追加して該当リソースを選択すると,プロパティウィンドウに(Name), Condition, ID, Languageの各項目と,該当リソース固有のプロパティが表示されます。

ただし,Conditionに指定できるシンボルは一つだけのようなので,X86_DEBUG, X86_RELEASE, X64_DEBUG, X64_RELEASEのようなシンボルを定義しておく必要があります。


一応,何もしないプログラムにバージョンリソースを追加したソリューション一式と,ビルドした結果できあがった各バージョンの実行ファイルを圧縮した物を添付しておきます。
添付ファイル
ConsoleApplication1.zip
Visual Studio 2013 Professional Update 1 C++ Solution File
(28.88 KiB) ダウンロード数: 229 回

Mana

Re: 自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

#8

投稿記事 by Mana » 12年前

浩二 さんが書きました:2.IDE専用のコマンドを調べて、x86,x64毎にABCx86.rcまたはABCx64.rcを
  プロジェクトから削除する、追加するの操作をする。
『ビルドから除外』を使えばいちいち削除したり追加したりしなくて済むのです。
頭に入れておくのではなくて同時に試して欲しいものですが。
Expressでも使える方法なのでExpressならこっちですね。
オフトピック
YuO氏の添付ファイルの中のリソースファイルをResEditで開くと中身表示されないし。

浩二

Re: 自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

#9

投稿記事 by 浩二 » 12年前

Manaさんありがとうございます。
「プロジェクトから削除する、追加」は、「プロジェクトから除外する、追加」の意味で書きました。
正確に書かずにすみませんでした。
この方式の各ビルド毎の手動では、できています。 手動ではなく、自動的に行いたいのです。

『ビルドから除外』とは「プロジェクトから除外」のことですよね?
もしも、そうではなくて、『ビルドから除外』できるファイル名をあらかじめ各ビルド毎に指定設定できるメニューがあるならば、
どこにあるか教えていただければありがたいです。 もしも、あれば便利な方法だと思います。

それから、「YuO氏の添付ファイルの中のリソースファイルをResEditで開くと中身表示されないし。」とのことですが、
VS2013では、エディターでも、リソースビューでも内容を見ることができています。 構築もできました。

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: 自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

#10

投稿記事 by YuO » 12年前

浩二 さんが書きました:『ビルドから除外』とは「プロジェクトから除外」のことですよね?
もしも、そうではなくて、『ビルドから除外』できるファイル名をあらかじめ各ビルド毎に指定設定できるメニューがあるならば、
どこにあるか教えていただければありがたいです。 もしも、あれば便利な方法だと思います。
プロジェクトから除外とビルドから除外は違いますよ。
ビルドから除外は,対象のファイルをソリューションエクスプローラーで選択後,ファイルのプロパティページを表示 (プロパティウィンドウではないことに注意) すると出てきます。

ただし,この方法で.rcファイルを管理することはお薦めしません。
1プロジェクトに複数の.rcファイルをVisual Studioが取り扱うことを想定していないようで,複数の.rcファイルを追加するとVSのリソースビューまわりの動作がおかしくなります。
浩二 さんが書きました:それから、「YuO氏の添付ファイルの中のリソースファイルをResEditで開くと中身表示されないし。」とのことですが、
VS2013では、エディターでも、リソースビューでも内容を見ることができています。 構築もできました。
ResEditがプリプロセッサ定義に対応していないのでしょう。
独自のプリプロセッサ,X86_DEBUG等をプロジェクト設定で定義しており,それが定義されていればVERSIONINFOが使われる,という形で作ってあります。
ResEditにはプリプロセッサ定義を行う場所が無いようですから,Conditionを設定したリソースは全て無視されることになります。
オフトピック
Conditionは,.rc中では#if defined(X86_DEBUG)のような形で使われる

浩二

Re: 自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

#11

投稿記事 by 浩二 » 12年前

YuOさんのプロジェクトは、
1. x86 Debug
2. x86 Release
3. x64 Debug
4. x64 Release
が、バッチビルドのメニューから一度に全部構築できました。
そしてバージョン情報はそれぞれ別々に4種類表示されました。

私のコンソールアプリで同じように操作したところ、
バッチビルドのメニューから一度に同様に全部構築できて、
アイコンとバージョン情報がそれぞれ実行ファイル毎に別々に表示されました。
初めの目標に到達しました。

今、わかったことはどれで、わからないことは何か整理しているところです。
整理できたら再び投稿します。 すごいなーと思っています。

浩二

Re: 自動でVC++コンソールアプリX86とx64のリソースを切り替えたい

#12

投稿記事 by 浩二 » 12年前

YuOさんありがとうございました。
YuOさんのとおりにリソースビュウを設定したところ、
私のコンソールアプリでアイコンとバージョン情報が
それぞれ実行ファイル毎に別々に表示されました。
MFCのGUIでも、試行錯誤でだいぶ時間(一日半)
がかかったのですが同様にできました。

>>プロジェクトから除外とビルドから除外は違いますよ。
「ビルドから除外」の項目を見つけました。
わかりました。知りませんでした。

リソースビューに Conditionの項目は探してみましたらありました。
あること自体知りませんでした。 メインメニューの「表示」メニューには必ず
プロパティページがのメニューがありますが、リソースビューからマウスの右クリックで
プロパティページのメニューが表示されたり、表示されなかったりするので
混乱しました。 どうしてこうなっているのだろう・・・。

リソースビューとリソースファイル(.rc)の関係がよくわからない。
どうも互いに反映するように作られているらしい。

当面知りたいこと。
リソースファイルを正しく書くための文法。
複数のリソースファイルに分割する方法と考え方。

あまりわからないことが多すぎて何がわからないのかも
わかりません。一応解決ということにさせていただきます。

皆様大変有難う御座いました。

閉鎖

“C言語何でも質問掲示板” へ戻る