Для моего текущего проекта я хочу иметь возможность загружать некоторые классы из dll (что не всегда одно и то же, и может даже не существовать при компиляции моего приложения). Также может быть несколько альтернативных dll для данного класса (например, реализация для Direct3D9 и одна для OpenGL), но только одна из DLL будет загружаться/использоваться в любой момент времени.
У меня есть набор базовых классов, которые определяют интерфейс плюс некоторые базовые методы/члены (т.е. те, которые используются для подсчета refrence) классов, которые я хочу загрузить, из которых затем создаются dll-проекты при создании классов.
//in namespace base
class Sprite : public RefCounted//void AddRef(), void Release() and unsigned refCnt
{
public:
virtual base::Texture *GetTexture()=0;
virtual unsigned GetWidth()=0;
virtual unsigned GetHeight()=0;
virtual float GetCentreX()=0;
virtual float GetCentreY()=0;
virtual void SetCentre(float x, float y)=0;
virtual void Draw(float x, float y)=0;
virtual void Draw(float x, float y, float angle)=0;
virtual void Draw(float x, float y, float scaleX, flota scaleY)=0;
virtual void Draw(float x, float y, float scaleX, flota scaleY, float angle)=0;
};
Дело в том, что я не уверен, как это сделать, чтобы исполняемые файлы и другие dll могли загружать и использовать эти классы, поскольку только ive использовала только DLL, где была только одна dll, и я мог бы иметь компоновщик Visual Studio все это с использованием .lib файла, который я получаю при компиляции dll.
Я не против использования методов factory для инициализации классов, многие из них уже по дизайну (т.е. класс спрайтов создается основным классом Graphics, например Graphics- > CreateSpriteFromTexture (base:: Texture *)
EDIT: Когда мне нужно было написать некоторые dll С++ для использования в python, я использовал библиотеку под названием pyCxx. В результате dll в основном экспортировал только один метод, который создал экземпляр класса "Module", который затем мог содержать методы factory для создания других классов и т.д.
Полученная dll может быть импортирована в python только с именем "import [dllname]".
//dll compiled as cpputill.pyd
extern "C" void initcpputill()//only exported method
{
static CppUtill* cpputill = new CppUtill;
}
class CppUtill : public Py::ExtensionModule<CppUtill>
{
public:
CppUtill()
: Py::ExtensionModule<CppUtill>("cpputill")
{
ExampleClass::init_type();
add_varargs_method("ExampleClass",&CppUtill::ExampleClassFactory, "ExampleClass(), create instance of ExampleClass");
add_varargs_method("HelloWorld", &CppUtill::HelloWorld, "HelloWorld(), print Hello World to console");
initialize("C Plus Plus module");
}
...
class ExampleClass
...
static void init_type()
{
behaviors().name("ExampleClass");
behaviors().doc ("example class");
behaviors().supportGetattr();
add_varargs_method("Random", &ExampleClass::Random, "Random(), get float in range 0<=x<1");
}
Как именно это работает, и могу ли я использовать его в чисто С++ среде для решения моей проблемы здесь?