2 Stimmen

c++ Aufruf einer nicht statischen Funktion aus einer statischen Funktion

Ich erlebe eine Zugriffsverletzung Fehler, wenn ich versuche, nicht statische Funktion aufrufen.

meine .h Datei sieht wie folgt aus.

class World
{
public:
    World();
    virtual ~World();
    static void CALLBACK DispatchCallback(
        SIMCONNECT_RECV *pData,
        DWORD cbData,
        void *pContext
    );
    void Process(SIMCONNECT_RECV *pData, DWORD cbData);
    virtual void frameEvent();
    virtual void init();
};

Nun rufe ich in meiner .cpp-Datei in der init()-Funktion eine Funktion auf, die Daten an meine Callback-Funktion zurückgibt.

SimConnect_CallDispatch(hSimConnect, DispatchCallback, NULL);

Der sendet Daten an den DisPatchCallback Funktion.

In dieser Funktion befindet sich der folgende Code:

void CALLBACK World::DispatchCallback(
    SIMCONNECT_RECV *pData,
    DWORD cbData,
    void *pContext)
{
    World *pThis = reinterpret_cast<World*>(pContext);
    pThis->Process(pData, cbData);
}

Diese Funktion ist eine statische Funktion, die ein World-Objekt erzeugt, um die Funktion Process aufzurufen.

Das funktioniert, aber es bricht in der Zeile ab, in der es auf die Funktion frameEvent zugreifen will.

void World::Process(SIMCONNECT_RECV *pData, DWORD cbData)
{
    HRESULT hr;

    switch(pData->dwID)
    {
    case SIMCONNECT_RECV_ID_EVENT_FRAME:
        frameEvent(); //it breaks here frameEvent is a non static function
        break;
    }
}

Zugriffsverletzung beim Lesen von Speicherplatz 0x00000000.

Kann mir jemand den richtigen Weg weisen, um dieses Problem zu lösen?

Falls es Sie interessiert, ich schreibe ein Plugin für den Microsoft Flight Simulator X.

Ich versuche zu implementieren simconnect.h auf eine oo Art. Msdn zeigt ein Beispiel, das ich gerade versuche zu implementieren.

class CName
{
    void Dispatch();
    static void DispatchCallback(
        SIMCONNECT_RECV *pData,
        DWORD cbData,
        void *pContext
    );
    void Process(SIMCONNECT_RECV *pData, DWORD cbData);

    HANDLE hSimConnect; // use SimConnect_Open to set this value.
};

void CName::Dispatch()
{
    ::SimConnect_Dispatch(hSimConnect, &CName;::DispatchCallback, this);
}

// static function
void CName::DispatchCallback(
    SIMCONNECT_RECV *pData,
    DWORD cbData,
    void *pContext)
{
    CName *pThis = reinterpret_cast<CName*>(pContext);
    pThis->Process(pData, cbData);
}

void CName::Process(SIMCONNECT_RECV *pData, DWORD cbData)
{
    // do processing of SimConnect data
}

Ich hoffe, ich habe genug Informationen gegeben.

8voto

Adam Rosenfield Punkte 373807

Sie passieren NULL als Kontextparameter für SimConnect_CallDispatch so dass Ihr Callback keine Ahnung hat, welche World Objekt zum Aufruf Process Wie soll das gehen, wenn Sie es nicht sagen? Ändern Sie den Aufruf zur Übergabe in this als Kontextparameter zu verwenden, wie es im Beispiel der Fall ist:

SimConnect_CallDispatch(hSimConnect, DispatchCallback, this);

2voto

littleadv Punkte 19953

Es bricht, weil this ist NULL.

Überprüfen Sie diesen Teil Ihres Codes:

World *pThis = reinterpret_cast<World*>(pContext);
pThis->Process(pData, cbData);

Wenn die reinterpret_cast scheitert erhält einen NULL-Wert - gibt er NULL zurück, und Sie prüfen nicht darauf.

2voto

Greg Hewgill Punkte 882617

Ihre Verwendung von:

SimConnect_CallDispatch(hSimConnect, DispatchCallback, NULL);

erscheint sehr verdächtig. Was ist das NULL Parameter im Aufruf dieser Funktion bedeuten? Ist das pContext ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X