MFC:覆盖卫星DLL

时间:2018-05-07 05:30:05

标签: c++ mfc

我有一个使用以下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以外的其他东西?

1 个答案:

答案 0 :(得分:1)

您不需要取消定义资源ID。

具有相同Id的资源可能在一个资源文件中存在不同的语言ID。

要将它们分开,可以使用命名行设置(AFX_RESOURCE_DLL)来编译RC文件。

为资源编译器定义AFX_RESOURCE_DLL时,它仅包含在命令行上定义的语言的资源,如AFX_TARG_ENUAFX_TARG_DEU

对于可能始终包含在satelaite DLL中的资源,我使用AFX_TARG_NEUD(中立资源)。

因此,您可能将所有资源放在一个文件中,或者您可能将资源分配到多个RC文件中。您可以通过#include语句将所有需要的资源文件包含到一个编译过程中,然后通过命令行define选择所需的目标语言。