3

ターゲット固有のリソースがいくつかあります。ターゲットclientの別のダイアログとターゲットadminの別のダイアログのように。また、各ターゲットに固有の文字列もいくつかあります。管理アプリに固有のリソースとコードをクライアント ビルドに含めたくありません。

adminclientcommonの 3 つのリソース ファイルがあり、何らかの方法でビルド エンジンにadmin ビルドにadmincommon res を使用し、client ビルドにclientcommon res を使用するように指示するとします。

どうすればこれを達成できますか?

複数のリソース ファイルを保持し、特定のターゲット ビルドにリソース ファイルを使用するにはどうすればよいですか?

4

4 に答える 4

5

.rc ファイルで #ifdef を使用できます。ただし、これはリソース エディタを台無しにします。これに対処する「標準的な」方法は、ターゲットごとに個別の .rc ファイルを作成し、#ifdef を実行する 1 つのスクリプトにそれらのそれぞれを #include することです。

#ifdef CLIENT_1
#include "client_1.rc"
#endif
#ifdef CLIENT_2
#include "client_2.rc"
#endif

このように、リソース エディタは「完全な」rc ファイルのみを解析する必要があります。それでも、このように作業するのは面倒です。なぜなら、エディターは混乱しやすいからです。むかしむかし、「ターゲット」ごとに個別のプロジェクトを作成して実験し、「リソース インクルード」セクションに相対パスでそれらを #include しました。結局、なぜそのアプローチを使わなかったのか覚えていません。プリプロセッサを使用すると、これを機能させることができますが、常に少しぎこちなく感じます。おそらく、最近のバージョンの VS の方がうまく処理できます。

于 2013-04-02T16:11:48.110 に答える
4

与えられた説明では、別の .RC ファイルが必要だとは思いません。両方 (または複数のターゲット) の文字列を持つ文字列テーブルを作成できます。起動時に、それらのいずれかを指す UINT 変数があります。例えば:

UINT nUserConfirmationId;
UINT nAcessDeiniedMsgId;

if(target1)
{
   nUserConfirmationId = IDD_ENG_STRING_ID_FOR_CONFIRM;
   ..
}
else
{
   nUserConfirmationId = IDD_FRE_STRING_ID_FOR_CONFIRM;
   ...
}

そして、nUserConfirmationIdetc. 変数を使用します。同様の方法で、ダイアログ リソースを使用できます (別のダイアログが必要な理由がわかりません。文字列のみを置き換える必要があります)。はい、リソースを追加すると、メンテナンスの問題があります。

または、ターゲット固有のリソースを含むリソースのみの DLL を使用することもできます。

于 2013-03-27T05:02:42.657 に答える
0

構成固有のリソースが少数しかない場合は、構成間で.rcを共有する方が簡単で保守しやすいと思うかもしれませんが、それらは異なるリソース サブセットを使用します。VS でもサポートされています (少なくとも 2017 年):個々のリソースの条件を追加します。

ソリューション エクスプローラーで、.rcをダブルクリックして [リソース ビュー]を開きます。リソース ツリーから、構成依存にするダイアログ、アイコンなどを右クリックし、 [プロパティ] を開きます

プロパティ ウィンドウにConditionが表示されます。

これで、クライアント、サーバー、管理ビルド専用に定義されたプリプロセッサ シンボルが既にあるはずです。(そうでない場合は、今すぐ実行してください! Property Pages -> C/C++ -> Preprocessor -> Preprocessor Definitions .)

この記号をConditionに追加するだけです。これには、 .rcファイルのコード ブロックの前後に#ifdef...を追加する効果がありますが、VS に適した方法で、エディターを壊すことはありません。#endif

注:ただし、このプロセスは String Tables では機能しないようです。UI のバグなのか、単にサポートされていないのかはわかりません。

于 2017-10-30T02:39:13.223 に答える