SheepSpeech Ответов: 1

Как переставить идентификаторы ресурсов с помощью MFC ?


Привет,

Я создаю приложение MFC с Расширение MFC DLL, на VC++2017. Мне нужно убедиться, что идентификаторы ресурсов различны для обоих этих проектов.
Если я этого не сделаю, мое основное приложение и моя библиотека DLL могут использовать один и тот же идентификатор, создавая проблемы при использовании ресурсов. Например, я пытаюсь показать диалог из моей библиотеки DLL, но этот диалог имеет тот же идентификатор, что и другой диалог в моем основном приложении, поэтому отображается именно основной диалог приложения...

Я не могу использовать только #define _APS_NEXT_*_VALUE, потому что Я хотел бы позволить другим людям писать DLL расширения MFC для моего приложения, и они не будут знать диапазоны идентификаторов ресурсов моего приложения и других расширений.

Спасибо!

Что я уже пробовал:

Исследования (форумы, MSDN, ..)

1 Ответов

Рейтинг:
12

Jochen Arndt

Видеть TN035: использование нескольких файлов ресурсов и заголовочных файлов с Visual C++[^].

Для вашего случая вы должны отредактировать один из ресурса.ч файлы, отрегулируйте _APS_NEXT_* значения внизу для новых ресурсов и настройте все существующие определения так, чтобы они были до следующих определений, но после определений, используемых до сих пор, плюс место для новых в другом файле. См. приведенную выше ссылку для допустимых диапазонов в разделе " Управление символами, совместно используемыми несколькими Visual C++ - Edited .RC-файлы".

Обратите внимание, что VS попросит вас перезагрузить файл при его редактировании во время открытия проекта. Примите это или лучше отредактируйте файл, когда соответствующий проект не открыт.

[РЕДАКТИРОВАТЬ]
Если необходимо поддерживать несколько библиотек DLL расширений, следует указать, что библиотеки DLL должны загружать ресурсы с помощью своих HMODULE с LoadResource() и HINSTANCE с другими функциями нагрузки.

Если библиотеки DLL используют MFC, они должны получить и сохранить текущий дескриптор ресурса с помощью AfxGetResourceHandle(), передайте их ручку AfxSetResourceHandle(), и восстановите настройку после загрузки ресурса. Смотреть также библиотека DLL расширения[^].
[/РЕДАКТИРОВАТЬ]


SheepSpeech

Привет,

Спасибо за ваш ответ. Я предполагаю, что ресурсы будут просто увеличиваться на единицу каждый раз, когда они будут добавлены в проект.

Однако моя конечная цель состоит в том, чтобы позволить другим людям создавать DLL расширения MFC для моего приложения. Я хотел бы найти решение, которое позволит избежать любого конфликта (и избежать необходимости устанавливать диапазон), потому что люди не будут знать диапазон, используемый основным приложением и другими расширениями.

Jochen Arndt

Это не было упомянуто в вашем первоначальном вопросе.

Я обновлю свой ответ.

SheepSpeech

Спасибо, я попробую это сделать и дам вам обратную связь !

SheepSpeech

Мне нужен совет:
Я просто хочу проверить что-то в диалоге моего расширения, поэтому я хотел бы быстро изменить значение _APS_NEXT_*_VALUE. Однако, когда я это делаю, мой диалог больше не появляется + его идентификатор не изменяется в resource. h. что я должен делать?
Кроме того, _APS_NEXT_*_VALUE-это следующее значение для текущего проекта, это нижний предел, верно?

Jochen Arndt

Следующие значения используются для новых ресурсов. Когда один добавляется, соответствующее следующее значение увеличивается. Существующие определения необходимо редактировать вручную.

SheepSpeech

Привет,

У меня есть еще один вопрос:в какой ситуации может произойти эта проблема с идентификатором? Потому что у меня была такая проблема, когда я пытался создать окно из идентификатора шаблона, т. е. таким образом:

CDialog myDlg(IDD_DIALOG1);
myDlg.Метод domodal();

Но у меня его больше нет, если я создаю свое окно с помощью класса, таким образом:

PluginDialog ДЛГ;
ДЛГ.Метод domodal();

Это случайность, или в данном случае я никак не могу получить конфликт идентификаторов? Мне нужны кое-какие объяснения.

Спасибо!

Jochen Arndt

Идентификаторы создаются при использовании редактора ресурсов. Это позволит выбрать следующее, используя соответствующее следующее значение из файла resource. h, добавить его в файл и увеличить следующее значение.

Если вы что-то меняете вручную, вы несете ответственность за то, чтобы все используемые идентификаторы существовали и чтобы не было дубликатов. Идентификаторы, которые не используются anmyore, не вредят. Они не будут конфликтовать с новыми идентификаторами, поскольку значение меньше фактического следующего значения.