Как вызвать функцию по имени, используя GObject?

Эта функция, которую я хочу вызвать с помощью GObject, выглядит следующим образом:

char * some_object_fun(SomeObject *self, char *input);

Есть ли хороший способ добиться этого? Я был бы очень заинтересован в элегантном решении.

1 ответ

Решение

C на самом деле не поддерживает интроспекцию / рефлексию, как вы привыкли, если вы работаете с чем-то вроде Python, PHP, Java и т. Д.

Я не знаю, что я бы назвал это "элегантным", но большинство операционных систем предлагают способ получить адрес публичного символа, поэтому, если ваш символ общедоступен, вы можете использовать его, приведя его к указателю на функцию соответствующий тип, затем вызовите функцию. В POSIX соответствующие функции называются dlopen а также dlsym, В Windows LoadLibrary а также GetProcAddress,

Ваши теги упоминают GObject, так что это немного упрощает; Вы можете просто использовать g_module_open а также g_module_symbol (которые в основном являются абстракциями над функциями, которые я упоминал выше).

Код будет выглядеть примерно так:

char* (* sym)(SomeObject*, char*);
GModule* module = g_module_open(NULL, 0);
sym = g_module_symbol("some_object_fun");
sym(instance, input);
g_module_close(module);

Плюс некоторая обработка ошибок, конечно, но вы должны быть в состоянии понять эту часть.

Другие вопросы по тегам