[ 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 |