Для моего текущего проекта я хочу иметь возможность загружать некоторые классы из библиотеки DLL (которая не всегда одинакова и может даже не существовать, когда мое приложение компилируется). Также может быть несколько альтернативных dll для данного класса (например, реализация для Direct3D9 и одна для OpenGL), но только один из dll будет загружен / использован одновременно.
У меня есть набор базовых классов, которые определяют интерфейс, а также некоторые базовые методы / члены (то есть, те, которые используются для подсчета ссылок) классов, которые я хочу загрузить, и которые затем создаются проектами 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 могли загружать и использовать эти классы, так как я когда-либо использовал dll только там, где был только один dll, и я мог иметь компоновщик Visual Studio все это с помощью .lib файла, который я получаю при компиляции DLL.
Я не возражаю против использования фабричных методов для создания экземпляров классов, многие из них уже проектируют (т. Е. Класс спрайтов создается основным классом Graphics, например Graphics-> CreateSpriteFromTexture (base :: Texture *)
EDIT:
Когда мне нужно было написать несколько библиотек c ++ для использования в python, я использовал библиотеку pyCxx. Результирующая dll в основном экспортировала только один метод, который создал экземпляр класса «Модуль», который затем мог бы содержать фабричные методы для создания других классов и т. Д.
Получившаяся 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");
}
Как именно это работает, и могу ли я использовать его в чисто с ++ среде для решения моей проблемы здесь?