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 es
    

    Weiß 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.


Anmelden zum Antworten