Erhalten eines Zeigers auf eine Klassenmethode, damit dieser als Callback an eine C-Funktion übergeben werden kann

StackOverflow https://stackoverflow.com//questions/10667587

Frage

Ich verwende libssh2 und habe eine Rückruffunktion außerhalb meines SSHWrapper-Objekts definiert:

static void kbd_callback(const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract);

In meinem SSHWrapper-Objekt mache ich Folgendes und übergebe die Rückruffunktion bei der Authentifizierung der Sitzung:

/* Create a session instance */
LIBSSH2_SESSION *session = libssh2_session_init_ex(NULL, NULL, NULL, self);
while ((rc = libssh2_userauth_keyboard_interactive(session, userChar, &kbd_callback)) == LIBSSH2_ERROR_EAGAIN);

Ich frage mich, ob es möglich ist, das zu verschieben kbd_callback() Funktion in meinem Objekt, sodass es eine Klassenmethode ist: +(void) kbd_callback:...?

Wenn ja, wie erhalte ich die Adresse dieser Funktion, um sie an die C-Funktion zu übergeben? libssh2_userauth_keyboard_interactive()?

War es hilfreich?

Lösung

Der Ansatz, den Sie jetzt verfolgen, ist vernünftig.Allerdings sind Objective-C-Methoden eigentlich nur C-Funktionen.Der von Ihnen vorgeschlagene Ansatz wird vor allem dadurch erschwert, dass er zwei „versteckte“ Argumente enthält: self, Und _cmd. self ist die Instanz des Objekts, für das die Methode aufgerufen wird, und _cmd ist der Selektor für die Methode.Sie können diese nicht ändern und ihr Vorhandensein macht es unmöglich, die Argumente Ihrer Funktion mit denen für die Callback-Funktion übereinstimmen zu lassen.

Für den Fall, dass es für Sie immer noch interessant ist, können Sie einen Funktionszeiger auf eine Objective-C-Methode wie folgt erhalten:

IMP methodIMP = [self methodForSelector:@selector(someMethodThatTakesOneStringArgument:)];
void (*functionPointer)(id, SEL, NSString*) = (void (*)(id, SEL, NSString*))methodIMP;

// Then call it:
functionPointer(instance, @selector(someMethodThatTakesOneStringArgument:), aString);

BEARBEITEN:Ich habe hier ein einfaches, vollständiges Programm gepostet, das diesen Code in Aktion demonstriert: https://gist.github.com/2731937

Andere Tipps

nein.Die zugrunde liegende C-Funktion, die von dem generationspoDicetagcode erstellt wird, sollte nicht direkt auf dieser Weise aufgerufen werden.Wenn Sie nicht mit der zugrunde liegenden objektiv-c-Laufzeit sehr vertraut sind, lässt sich das Messen mit den IP-Funktionen nur in Schwierigkeiten bringen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top