2

我的应用程序每次为每个客户编译时都要求我更改徽标和图标。手动执行此操作自然会耗费时间且容易出错,因此我编写了 .Net 表单以从 .rc 文件加载其图像和图标,但我正在尝试在资源文件中使用一些预处理器魔法。

我的目标是让它只从具有客户 ID 的目录中自动加载一个图像和图标。这将防止 .rc 文件链接不需要的图像和文件,并使每个客户的设置变得像单个前置命令一样简单。

我有一个名为“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 文件预处理器指令非常有限,请参阅:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa381033 (v=vs.85).aspx

指令描述
#define 通过为其分配给定值来定义指定名称。
#elif 标记条件编译块的可选子句。
#else 标记条件编译块的最后一个可选子句。
#endif 标记条件编译块的结束。
#if 如果指定表达式为真,则有条件地编译脚本。
#ifdef 如果定义了指定的名称,则有条件地编译脚本。
#ifndef 如果未定义指定名称,则有条件地编译脚本。
#include 将文件的内容复制到资源定义文件中。
#undef 删除指定名称的定义。

并且#define是简单的形式:(在http://msdn.microsoft.com/en-us/library/windows/desktop/aa381061(v=vs.85).aspx之后):

#定义名称值

有解决方案 - 根据这个答案准备您的 ICON/BITMAPS 路径作为环境变量,您可以从客户名称构建它们 - 但必须在您的批处理文件或生成文件中完成:

从已经提到的答案:

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 回答