Register Callback "context"

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Benutzeravatar
lightos
User
Beiträge: 39
Registriert: Montag 12. Dezember 2011, 19:39
Wohnort: Raum Bruchsal
Kontaktdaten:

Hallo,

ich habe eine generelle Frage zu einer C-Dll-Anbindung bzgl. Callback/this*.

Häufig findet sich für die Anbindung von C++ über die C-API der context (void*), um "this" in der Callback durchzureichen.

Beispiel:

Code: Alles auswählen

RegisterDeviceChangeCallback(
  const char* deviceSetDescription,
  CB_DeviceChangeEvent* callback,
  void* callbackContext,
  PnPNotificationHandle* notificationHandle,
  unsigned int flags
  );
Die Kernfrage: Wwas übergebe ich von Python aus für den callbackContext? ctypes.pyObject?

Der Callback in C sieht so aus:

Code: Alles auswählen

API_CALL
CB_DeviceChangeEvent(
  DeviceEvent eventType,
  void* callbackContext
  );
In C++ kann man so aus dem callbackContext wieder die Methoden der Instanz verwenden.
In Python?
Zuletzt geändert von Anonymous am Donnerstag 16. April 2015, 12:52, insgesamt 1-mal geändert.
Grund: Quelltext in C-Code-Tags gesetzt.
BlackJack

@lightos: Also wenn ich das richtig verstanden habe übergibt man da in Python gar nichts, also einfach 'nen Null-Pointer (`None` in Python). Denn wenn man als Callback eine Python-Methode registriert dann ist die ja schon an das Objekt gebunden von dem sie abgerufen wurde, das Python-``this`` (= `self`) ist da ja schon enthalten.
Benutzeravatar
lightos
User
Beiträge: 39
Registriert: Montag 12. Dezember 2011, 19:39
Wohnort: Raum Bruchsal
Kontaktdaten:

Hallo BlackJack,

danke für die schnelle Antwort.
So ähnliche Antworten gab es auch in anderen Foren. Aber damit scheint das mit ctypes einfach so zu funktionieren.

Also:

Code: Alles auswählen

CB_DeviceChangeEvent = ctypes.CFUNCTYPE(None, ctypes.c_char, ctypes.c_void_p)

class()
....

def cb_device_change(self, eventType, context):
        print('Callback from Dll: DeviceChanged!')

cb = CB_DeviceChangeEvent(self.cb_device_change)
Verwende ich bei der Übergabe der CB-Funktion dann self. oder <className>.?

Danke,
lightos
BlackJack

@lightos: Na `self`, denn Du willst ja in der Methode sicherlich Zugriff auf `self` haben, sonst bräuchte es keine Methode sein. Hast Du auf den Hinweis in der Dokumentation geachtet das *Du* verantwortlich bist das `cb`-Objekt so lange irgendwo aufzuheben wie die Rückrufe von C kommen können?
Benutzeravatar
lightos
User
Beiträge: 39
Registriert: Montag 12. Dezember 2011, 19:39
Wohnort: Raum Bruchsal
Kontaktdaten:

Hallo BlackJack,

danke für den Hinweis. Nun klappt das so wie gedacht.

Wünsche ein schönes Wochenende.

lightos
Antworten