您的位置:首页 > 其它

rc资源文件重写问题的解决

2016-04-22 17:51 197 查看
目标:通过预编译的方式修改debug文件夹下exe文件的图标,同时窗口图标和桌面任务栏图标也显示一致。

最终实现方法:

1、复制两个ico文件(a.ico和b.ico)到res文件夹下,工程目录下新建a.rc和b.rc两个文件(不用添加到工程中),分别写:

IDR_MAINFRAME           ICON                    "res\\a.ico"

IDR_MAINFRAME           ICON                    "res\\b.ico"

2、修改工程目录下原本就有的rc文件,将下面这一行注释掉:

IDR_MAINFRAME           ICON                    "res\\MyApp.ico"

ps:rc文件最上面无需再添加下面这行代码,添加的话调试运行时会出现本文最后提到的错误。

#include "res\MyIcon1.rc2"

3、VS里右键添加新建项,选择头文件(.h),这里取文件名为Init.h

文件内的代码两行如下:

#define _A_VERSION

 

ps:如果_A_VERSION后面没有一个回车换行的话,调试运行的时候会出错。

4、修改res文件夹下rc2文件:

/////////////////////////////////////////////////////////////////////////////

// 在此处添加手动编辑的资源...

#include "..\Init.h"

#ifdef _A_VERSION

#include "a.rc"

#else

#include "b.rc"

#endif

/////////////////////////////////////////////////////////////////////////////

经过上面四个步骤后,调试运行时exe文件能正常显示图标a.ico。接着修改Init.h文件为:

#define _B_VERSION

 

(↑注意此处是两行,因为有个回车换行↑)

再次调试运行,exe文件能显示为另一个图标b.ico。

实现过程:

最开始是想通过代码修改resource文件里icon的值来实现图标转换(因为exe文件的图标显示的是resource文件里ICON值最小的那个ICON),但是却不能在预编译的条件下通过代码来修改文件。后来想了下,修改文件的代码肯定是要经过编译的,所以这种方法不可行。接着是想通过修改rc文件来实现图标转换(即把上面第四步的代码改放在rc文件里),但实现后再添加字符串资源时,rc文件会自动改写,导致后面修改配置文件(即上面的Init.h文件)时均不能再转换图标,但是查到资料说TEXTINCLUDE里的2是只读符号指令,觉得应该可以添加预编译代码在这里,但又试了好久,还是没能实现。接着就是通过上述方法,结果发现是可以实现效果的。

小结:工程文件夹下的rc文件是属于编辑器自己的资源文件, 编译器自己维护的, 我们改了也有问题如果要自己添加, 编译器会有一个
rc2文件 , 这个就是用来给编辑的。

如果在调试运行时显示如下链接错误:

CVTRES : fatal error CVT1100: duplicate resource.  type:GROUP_ICON, name:128, language:0x0804

1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

则是由于资源重复定义了,这里是值为128的ICON重复定义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: