2

私のアプリでは、顧客ごとにコンパイルするたびにロゴとアイコンを変更する必要があります。これを手動で行うと、当然、時間がかかり、エラーが発生しやすくなるため、.rc ファイルからイメージとアイコンをロードする .Net フォームを作成しましたが、リソース ファイルでプリプロセッサ マジックを実行しようとしています。

私の目標は、顧客の ID を持つディレクトリから 1 つの画像とアイコンのみを自動的にロードすることです。これにより、.rc ファイルが不要なイメージやファイルにリンクするのを防ぎ、各顧客のセットアップを単一の prepcessor コマンドと同じくらい簡単にします。

リソースのフォルダー名である「CUSTOMER_ID」というトークンがあります。したがって、それらのファイルは「../files/images/customer1/」にあり、ここで CUSTOMER_ID = customer1 です。

リソースを定義できるように、プリプロセッサに "..files/images/" の定数を CUSTOMER_ID と連結させ、その後に "icon.ico" または "logo.bmp" を連結させたいと考えています。これは私が現在持っているものです:

//in resources.rc
#include "airline.h"
#define CONCAT(dir, cid, filetype) dir ## cid ## filetype

IDI_ICON1 ICON  CONCAT("../files/images/",CUSTOMER_ID,"icon.ico")

ただし、結果は常にオフに終わります。アドバイス?

4

1 に答える 1

1

RC ファイルのプリプロセッサ ディレクティブは非常に限られています

ディレクティブの説明
#define 特定の値を割り当てて、指定した名前を定義します。
#elif 条件付きコンパイル ブロックのオプション句をマークします。
#else 条件付きコンパイル ブロックの最後のオプション句をマークします。
#endif 条件付きコンパイル ブロックの終了を示します。
#if 指定された式が true の場合、スクリプトを条件付きでコンパイルします。
#ifdef 指定した名前が定義されている場合、スクリプトを条件付きでコンパイルします。
#ifndef 指定された名前が定義されていない場合、条件付きでスクリプトをコンパイルします。
#include ファイルの内容をリソース定義ファイルにコピーします。
#undef 指定された名前の定義を削除します。

そして#define、単純な形式です: ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa381061(v=vs.85).aspxの後):

#名前の値を定義

解決策があります-この回答によると、ICON/BITMAPSパスを環境変数として準備し、衣装名からそれらを構築できます-しかし、それはあなたのbatchFileまたはmakefileで行う必要があります:

すでに述べた答えから:

In your project properties add ;$(CMDLINE_DEFINES) to the end of your resource preprocessor definitions. (Be sure to pick the right configuration.)

Then when you use MSBuild from the command line type (or add to a batch file)...

C:\Projects\SomeProject> set CMDLINE_DEFINES=SOMETEST=42
C:\Projects\SomeProject> MSBuild SomeProject.vcproj

この回答は C++ ファイルに対するものでした:

あなたの例:

CONCAT("../files/images/",CUSTOMER_ID,"icon.ico")

次のようなマクロを使用する必要があります。

#define TOSTRING(T) #T
#define CONCAT(dir, cid, filetype) dir TOSTRING(cid) filetype

これは、このマクロ展開が"../files/images/" "customer1" "icon.ico". また、C++ コンパイラは隣接する文字列リテラルを連結します。

この例:

#include <iostream>

#define TOSTRING(T) #T
#define CONCAT(dir, cid, filetype) dir TOSTRING(cid) filetype

#define CUSTOMER_ID customer1

int main() {
    std::cout << ">>>>>" << CONCAT("../files/images/",CUSTOMER_ID,"icon.ico") << "<<<<\n";
}

出力が生成されます:

>>>>>../files/images/customer1icon.ico<<<<

/前に追加する必要がある可能性がありますicon.ico...

于 2012-11-16T22:04:32.117 に答える