[ AmberSkyNet VR ]Я кладу кирпичную стену, аккуратно, не спеша. Пора переходить к плагинам. Иначе новые классы будут прирастать к главному и впоследствии "отдирать" их в отдельные загрузочные модули будет труднее Собственно сам загрузочный модуль (dll,so) будет обеспечивать только вызов одной-единственной функции GetPlugin - создание экземпляра класса-генератора. Класс-генератор (интерфейс к нему IAsnGenerator) будет "генерировать", т.е. создавать экземпляры классов по их типу. Его функция GetClass с параметром, определяющим тип класса, создаёт экземпляр класса и возвращает указатель на него или NULL, если генератор не может создавать экземпляры классов указанного типа. struct IAsnGeneratorInfo { std::string name, //имя загрузочного модуля type, //поддерживаемые типы генерации экземлпяров классов author, //автор плагина description, //описание плагина plugin_version, //версия плагина required_version; //требуемая версия движка, не ниже //TODO }; struct IAsnGenerator { public: ... // возвращаем экземпляр класса, на входе - имя класса // NULL на выходе, если генератор не смог содать класс типа Type virtual void *GetClass(const std::string& Type); // передаём указатель на Engine virtual void Initialize(IEngine *vEngine); // получаем информацию о плагине IAsnGeneratorInfo GetInfo(); } Для более удобной работы с классами-генераторами и плагинами сделаем
отдельный класс CPluginFactory, который и будет заниматься
загрузкой/выгрузкой модулей и созданием классов. class CPluginFactory { public: ... // сканируем директорию с плагинами классов-генераторов и загружаем их void ScanDirectory(std::string DirName, bool Recursive); // загрузить модуль класса-генератора IAsnGenerator, true - ошибка при загрузке bool LoadASNModule(const std::string& ModuleName); // выгрузить модуль плагина //bool UnloadModule(const std::string& ModuleName); // создать класс с типом Type на основе всех известных классов-генераторов void *CreateType(const std::string& Type); ... } Изменения в исходникахinclude/: Добавлен файл os_deps.h в котором собраны платформозависимые решения по работе с файловой системой - получение информации о файле, директории. src/asnCommon/: Добавлен файл утилитарных функций выделения имени и расширения файла. Они понадобились для определения имеет ли найденный при сканировании папки файл расширение загружаемого модуля (.dll,.so) и для занесения указателя на модуль в список с именем модуля, отбрасывая его путь. src/asnMain/: Добавлен класс загрузки плагинов. Main с его помощью и загружает теперь экземпляр СEngine из отдельной dll под видом IEngine. src/asnEngine/: В движке появился первый загрузочный модуль! В него вынесен из asnMain класс CEngine, созданный на предыдущем шаге. Исходники этого шага выложены в SVN. Скачать их можно набрав команду: svn co https://svn.sourceforge.net/svnroot/ambernet/tags/AmberSkyNet-0.3 ambernet_0.3 |