MFC: переопределение пути растрового изображения в файле RC в спутниковой DLL
У меня есть основной исполняемый файл, который использует следующие файлы 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 ответ
Вам не нужно отменять определения идентификаторов ресурсов.
Ресурсы с одинаковым идентификатором могут существовать с разными идентификаторами языка в одном файле ресурсов.
Чтобы разделить их, легко скомпилировать RC-файл с параметром командной строки, который предопределен AFX_RESOURCE_DLL
,
когда AFX_RESOURCE_DLL
определяется для компилятора ресурсов, он включает в себя только ресурсы для языка, который также определяется в командной строке, как AFX_TARG_ENU
или же AFX_TARG_DEU
,
Для ресурсов, которые всегда могут быть включены в satelaite DLL, которую я использую AFX_TARG_NEUD
(Нейтральный ресурс).
Таким образом, у вас могут быть все ресурсы в одном файле, или у вас могут быть ресурсы, распределенные по нескольким файлам RC. Вы можете включить все необходимые файлы ресурсов в один процесс компиляции через #include
Заявление, и вы можете выбрать нужный язык с помощью командной строки определить.