Interface: Aufruf bei bestimmten Funktionen schlägt Fehl
-
Hallo,
ich kämpfe gerade mit einem Problem, dass ich absolut nicht nachvollziehen kann.Ich habe folgendes Interface:
class IPyModule { public: virtual ~IPyModule() { } virtual void AddFunction(const string &strName, PyFunction pyFunction, const string &strDocumentation = "") = 0; virtual void AddFunction(const string &strName, PyFunctionKeywords pyFunctionKeywords, const string &strDocumentation = "") = 0; virtual void AddFunction(const string &strName, PyFunctionNoArgs pyFunctionNoArgs, const string &strDocumentation = "") = 0; virtual void AddConstant(const string &strName, long nValue) = 0; virtual void AddConstant(const string &strName, const string &strValue) = 0; virtual void AddException(const string &strName, PyObject **pyException) = 0; virtual bool Initialize(string &strError) = 0; virtual long GetConstantLong(const string &strName) const = 0; virtual const string &GetConstantString(const string &strName) const = 0; virtual PyObject *GetException(const string &strName) const = 0; virtual IInterpreter *GetInterpreter() const = 0; virtual const string &GetName() const = 0; virtual const string &GetDocumentation() const = 0; virtual PyObject *GetPyModule() const = 0; virtual PyObject *GetPyDict() const = 0; virtual PyMethodDef *GetMethodDef() const = 0; };Dieses liefere ich in meine SDK aus.
In meinem Hauptprogramm habe ich nun die Implementation:
class CPyModule: public IPyModule { public: CPyModule(IInterpreter *pInterpreter, const string &strName, const string &strDocumentation = ""); virtual ~CPyModule(); virtual void AddFunction(const string &strName, PyFunction pyFunction, const string &strDocumentation = ""); virtual void AddFunction(const string &strName, PyFunctionKeywords pyFunctionKeywords, const string &strDocumentation = ""); virtual void AddFunction(const string &strName, PyFunctionNoArgs pyFunctionNoArgs, const string &strDocumentation = ""); virtual void AddConstant(const string &strName, long nValue); virtual void AddConstant(const string &strName, const string &strValue); virtual void AddException(const string &strName, PyObject **pyException); virtual bool Initialize(string &strError); virtual long GetConstantLong(const string &strName) const; virtual const string &GetConstantString(const string &strName) const; virtual PyObject *GetException(const string &strName) const; virtual IInterpreter *GetInterpreter() const; virtual const string &GetName() const; virtual const string &GetDocumentation() const; virtual PyObject *GetPyModule() const; virtual PyObject *GetPyDict() const; virtual PyMethodDef *GetMethodDef() const; public: bool Release(string &strError); private: IInterpreter *m_pInterpreter; string m_strName; string m_strDocumentation; PyObject *m_pyModule; PyObject *m_pyDict; PyMethodDef *m_pyMethodDef; list<Function_s> m_Functions; map<string, long> m_ConstantsLong; map<string, string> m_ConstantsString; map<string, Exception_s> m_Exceptions; };Über eine Schnittstelle können sich Plugins nun neue CPyModule-Instanzen erstellen lassen, welche von IPyModule ableiten. Somit sollten Plugins ja problemlos auf alle Funktionen von IPyModule zugreifen können.
Das ganze funktioniert auch, aber eben nur bis zur Funktion
IPyModule::Initialize. Alles was ich danach aufrufe, erzeugt einen sofortigen Crash des ganzen Programmes.
Edit: Damit meine ich, dass alle Funktionen, die unterhalb von "Initialize" definiert sind, nicht aufrufbar sind.Beispiel:
pModule = pScript->GetInterpreter()->AddModule("test"); pModule->AddFunction("hallo", PyHallo); pModule->AddConstant("const", 20); pModule->Initialize(strError); // bis hier hin läuft alles gut // wenn ich jetzt beispielsweise pModule->GetInterpreter() aufrufen will, crasht esWeiß jemand, woran das liegen könnte? Ich verstehe es einfach nicht...
Programm und Plugin benutzen 100% die gleichen Headerdateien, sind sogar zum exakt gleichen Zeitpunkt mit dem gleichen Compiler (MSVC 2008) auf dem selben System (Windows XP) erstellt worden...Gruß
-
Den Fehler wird man Dir wohl kaum nennen können. Dazu ist der Codeumfang zu gering.
Füg einfach einige Debug-Ausgaben und assert hinzu.
pModule = pScript->GetInterpreter()->AddModule("test"); pModule->AddFunction("hallo", PyHallo); pModule->AddConstant("const", 20); assert(pModule); assert(pModule->Initialize(strError));Und das mit strError kommt mir komisch vor. Vielleicht hapert es daran. Weitere Debug-Ausgaben!
Und wenn alles nicht hilft, dann mach einige Tage Pause und probiers danach nochmal.