Наше текущее приложение представляет собой один EXE-файл OpenGL, содержащий несколько страниц. EXE отвечает за доступ к данным, отправляемым по сети через UDP. Он накапливает данные и сохраняет их во множестве одноэлементных структур. Отдельные страницы в EXE-файле получают доступ к одноэлементным структурам для обработки данных по своему усмотрению.
В попытке уменьшить размер нашего EXE-файла и поддержать наши попытки управления конфигурацией мы решили разделить страницы на одну DLL, которую будет загружать EXE. Мы намерены сделать EXE оболочкой, в которую будут загружены страницы из DLL. EXE по-прежнему будет нести все обязанности по обмену данными (UDP, Corba, User и т. д.). Страницы по-прежнему будут нести ответственность за отображение всего, что они делают.
Вопрос (наконец) звучит так: как мне передать это множество данных, собранных из EXE, на потребляющие страницы на основе DLL. Концепция синглтона больше не выдерживает критики, поскольку используемые нами синглтоны (ACE_Singleton) не допускают такого уровня направления. Мы можем экспортировать синглтоны из DLL в потребляющий EXE-файл в течение всего дня, но мне еще предстоит выяснить обратное. Я придумал следующие варианты - ни один из них мне не нравится, поэтому я надеялся, что у кого-то есть лучший :)
- Оберните все данные, которые в настоящее время хранятся в отдельных синглтонах, в другую DLL, которая будет экспортировать «настоящий» синглтон. Например. Синглтон, экспортируемый из DLL, будет одним и тем же - независимо от того, какой EXE-файл его загрузит - вроде общей памяти. Это интригующий выбор, но он может вызвать проблемы в наших сценариях развертывания. Я мог бы подробно рассказать об этих проблемах, если люди действительно поражены этой идеей.
- Создайте статическую структуру уровня DLL, содержащую все соответствующие данные. EXE передаст эти данные в DLL при загрузке DLL, чтобы страницы, содержащиеся в DLL, имели доступ к данным. Это кажется самым простым решением, даже если оно влечет за собой редактирование каждой отдельной страницы в нашем приложении — более 100. Это также кажется немного неаккуратным. Все данные находятся только в глобале. Не очень сексуальный или C++y.
Итак, у кого-нибудь еще есть решение этой проблемы?
Приложение написано с использованием Visual C++ 9.0 (VisualStudio 2008) для использования в Windows XP. По какой-то причине Vista пока не поддерживается в нашей лаборатории, хотя наши клиенты используют ее.