HomeBlogMagic

C Callback Funktion in C++

Hier wird in in einer einfachen Konsolenanwendung gezeigt wie eine C Callback Schnittstelle mit C++ genutzt werden kann.

Das Programm kann in eine main.cpp kopiert und direkt ausgeführt werden, oder eben z.B. bei onlinegdb.com direkt ausgeführt werden.

#include <stdio.h>

typedef bool (*PMethod)(void* pContext);

PMethod g_pMethod = nullptr;
void*   g_pContext = nullptr;

void RegisterCallback(PMethod pMethod, void* pContext)
{
  g_pMethod = pMethod;
  g_pContext = pContext;
}

void UnregisterCallback()
{
  g_pMethod = nullptr;
  g_pContext = nullptr;
}

void CallCallback()
{
  (*g_pMethod)(g_pContext);
}

class CSampleClass
{
public:
  CSampleClass()
  {
    RegisterCallback(CSampleClass::callback, this);
  }
  ~CSampleClass()
  {
    UnregisterCallback();
  }

private:
  static bool callback(void* pContext)
  {
    // Check Context
    if (pContext != nullptr)
    {
      CSampleClass* pSampleClass = static_cast<CSampleClass*>(pContext);
      pSampleClass->call();
      return true;
    }
    else
    {
      return false;
    }
  }
  bool call()
  {
    printf("Callback successfully called\n");
    return true;
  }
};

int main(int, char**)
{
  CSampleClass oSampleClass;
  CallCallback();
}

Dies funktioniert nur bei Callbacks welche auch einen Kontext (pContext)mit liefern. So gibt es z.B. unter windows die funktion RegisterServiceCtrlHandler einmal ohne Kontext und mit RegisterServiceCtrlHandlerEx eine mit Kontext handle.

Ein Beispiel wo es in meinen CcOS Framework eingesetzt wird ist bei sqlite3. Dieses Basiert auf dieser Callback Technik und wird im Framework auf diese weise in einen Objekt orientierten Stil gebracht.

Wer mehr Erklärung benötigt, bitte um kurzen Kommentar oder Nachricht.

NameTypeComment

NameTypeComment