C++: le chargement dynamique de classes à partir de dll

Pour mon projet actuel, je veux être en mesure de charger des classes à partir d'une dll (qui n'est pas toujours la même, et peut même ne pas exister lorsque mon application est compilée). Il peut aussi y avoir plusieurs alternatives de dll pour une catégorie donnée (par exemple une mise en œuvre pour Direct3D9 et un pour OpenGL), mais un seul de la dll sera chargé/utilisé à tout moment.

J'ai un ensemble de classes de base qui définissent l'interface ainsi que quelques méthodes de base/membres (c'est à dire ceux pour la refrence de comptage) des classes que je veux charger, ce qui la dll projets dérivent ensuite lors de la création, il y a de classes.

//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;
};

Le truc c'est que je ne suis pas sûr de savoir comment tout faire pour que le fichier exécutable et autres dll peuvent charger et utiliser ces classes depuis le ive jamais utilisé dll, où il n'y avait qu'une dll et j'ai pu avoir les Visual Studio linker le tri à l'aide de l' .fichier lib que j'ai quand compileing dll.

Je n'ai pas l'esprit à l'aide de méthodes de fabrique pour l'instanciation des classes, beaucoup d'entre eux le font déjà par la conception (c'est à dire une classe sprite est créé par le principal de la classe Graphics, par exemple, des Graphiques->CreateSpriteFromTexture(base::Texture*)

EDIT:
Quand j'ai besoin de l'écrire en c++ dll pour une utilisation en python, j'ai utilisé une bibliothèque appelée pyCxx. Le résultant dll essentiellement exportés uniquement une méthode, qui a créé une instance de la "Module" de la classe, qui pourrait contenir de l'usine de méthodes pour créer d'autres classes, etc.

L'résultant dll peuvent être importés en python juste avec "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");
    }

Exactement comment cela fonctionne, et pourrais-je l'utiliser dans un but purement c++ de l'environnement afin de résoudre mon problème ici?

InformationsquelleAutor Fire Lancer | 2009-01-10