如何在MFC中为不同的构建目标使用不同的资源文件

Ron*_*nie 3 mfc build target visual-studio visual-c++

我有一些针对特定目标的资源.就像目标客户端的不同对话框和目标管理员的不同对话框一样.还有一些特定于每个目标的字符串.我不希望客户端版本中存在特定于admin app的资源和代码.

假设我可以拥有3个资源文件,admin,clientcommon,并以某种方式告诉构建引擎使用admincommon res进行admin构建,并使用clientcommon res进行客户端构建.

我怎样才能做到这一点?

如何拥有多个资源文件并使用资源文件进行特定的目标构建.

Roe*_*oel 8

好的,这是我完全回答你的问题,如果只是获得赏金会很有趣(他们不会经常在MFC标记的问题中发生:)).请说明您认为哪些问题没有得到解决,如果有的话.这与VS 2008一样,对其他版本的更改应该是最小的.

  • 首先为每个不同的构建目标添加资源文件,例如"admin.rc","common.rc"等.在解决方案浏览器中,右键单击项目,"添加 - >新项目 - >资源文件" ".

  • 在解决方案浏览器中右键单击新添加的资源文件,选择"属性",然后在"常规"下将"从构建中排除"设置为"是".

  • 在资源视图中,您现在可以将所需资源添加到相应的资源文件中.

  • 接下来,在Resource View中,右键单击"main"资源文件()并选择"Resource Includes".

  • 在下面的框中,在那里的任何一端,添加

#ifdef ADMIN
#include "admin.rc"
#endif
Run Code Online (Sandbox Code Playgroud)

当然,在预处理器中使用的符号可以自己选择,文件名需要与之前创建资源文件时选择的内容相匹配.

  • 然后,在"管理"项目配置中(假设您为每个目标使用不同的配置?),在解决方案资源管理器中,右键单击项目并导航到"资源 - >常规".在"预处理器定义"下,添加"ADMIN"(或您在上一步中选择的任何内容).

  • 构建您的解决方案 您可以使用http://www.wilsonc.demon.co.uk/d10resourceeditor.htmhttp://melander.dk/reseditor/等内容验证二进制文件中包含的资源.

请注意,显然您必须考虑各种构建中不可用的资源; 因此,您必须确保没有显示将在其构造函数中使用对话框IDD的对话框.您也可以通过预处理器执行此操作; 只需在相应的配置中将相同的标志添加到C++预处理器.

另一个问题是每个.rc文件都有一个resource.h,它们每个都会使用自己的编号.您可以通过仔细的命名和编号来完成这项工作,但我会为每个分配不同的范围,以便在编译时捕获尽可能多的问题.要执行此操作,请打开"resource1.h"或您调用的任何内容,并将_APS_NEXT__VALUE定义更改为更高的数字.

或者,您可以将所有资源定义粘贴到一个resource.h中,并编辑所有.rc文件以包含该一个resource.h.只需右键单击解决方案资源管理器中的rc文件,然后选择"打开方式"并单击"源代码编辑器".如果你要沿着"复杂的资源构建"路线走,你必须熟悉rc文件的格式(至少对于基础知识).这并不难,只要确保你能够了解链接器,资源编译器,.rc文件,.cpp文件和resource.h文件是如何相互关联的.此外,MFC特定的预处理器值最初看起来很令人生畏,但它们大部分都是不言自明的,无论如何你都可以忽略它们.

Petzold对资源文件及其格式有一个简洁但充分的解释,你可能想把它从壁橱中挖出来,并在你掌握一切东西的时候把它放在手边.


Roe*_*oel 5

您可以在.rc文件中使用#ifdef.但是这会搞砸资源编辑器.处理此问题的"标准"方法是为每个目标分别使用.rc文件,然后在一个脚本中#include它们中的#ifdef,例如

#ifdef CLIENT_1
#include "client_1.rc"
#endif
#ifdef CLIENT_2
#include "client_2.rc"
#endif
Run Code Online (Sandbox Code Playgroud)

这样资源编辑器只需要解析"完整"的rc文件.尽管如此,这样的工作很痛苦,因为编辑很容易混淆.曾几何时,我还尝试为每个"目标"设置一个单独的项目,然后在我的"资源包含"部分中使用相对路径#include它们.我不记得为什么我最后没有使用这种方法.使用预处理器可以使这个工作,但它总是感觉有点笨拙.也许VS的最新版本可以更好地处理它.