在我的当前项目中,我希望能够从一个dll中加载一些类(这个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时得到的.lib文件让Visual Studio链接器来解决所有问题。
我不介意为实例化这些类使用工厂方法,其中很多类已经通过设计使用此方式(例如,精灵类由主图形类创建,即Graphics->CreateSpriteFromTexture(base::Texture*))。
编辑: 当我需要编写供Python使用的C++ dll时,我使用了一个名为pyCxx的库。结果得到的dll基本上只导出了一个方法,该方法创建了“Module”类的一个实例,该实例然后可以包含用于创建其他类等的工厂方法。
最终的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");
}
它到底是如何工作的,我能在纯C++环境中使用它来解决我的问题吗?