我有一个使用以下RC文件的主要可执行文件:
main.rc
bitmaps.rc
main.rc
将#include bitmaps.rc
。
我希望位图(和其他资源)在运行时可以交换,所以我决定使用DLL方法并使用AfxSetResourceHandle
交换资源。
我目前的做法:
在卫星DLL项目中,它的RC文件只需执行#include main.rc
即可首先从主可执行文件中获取所有资源。然后,我使用以下内容替换特定的位图(只需要更改一些):
#undef IDB_ICON
IDB_ICON BITMAP "..\\newIcon.bmp"
#undef IDB_ABOUT
IDB_ABOUT BITMAP "..\\newAbout.bmp"
#undef
使其编译而不会出现“重复资源”错误。但是,替换在运行时不起作用。
我能让它工作的唯一方法是在卫星项目中将bitmaps.rc
复制为bitmapsSatellite.rc
,然后进行少数路径交换。当然,main.rc
被调整为仅包含一个位图rc文件,具体取决于项目。
我希望的方法更清晰,更自我解释。有没有办法使它工作,也许使用#undef
以外的其他东西?
答案 0 :(得分:1)
您不需要取消定义资源ID。
具有相同Id的资源可能在一个资源文件中存在不同的语言ID。
要将它们分开,可以使用命名行设置(AFX_RESOURCE_DLL
)来编译RC文件。
为资源编译器定义AFX_RESOURCE_DLL
时,它仅包含在命令行上定义的语言的资源,如AFX_TARG_ENU
或AFX_TARG_DEU
。
对于可能始终包含在satelaite DLL中的资源,我使用AFX_TARG_NEUD
(中立资源)。
因此,您可能将所有资源放在一个文件中,或者您可能将资源分配到多个RC文件中。您可以通过#include
语句将所有需要的资源文件包含到一个编译过程中,然后通过命令行define选择所需的目标语言。