Проблема в том, что вы не объявляете функции C как extern(C)
. Из-за этого dmd думает, что вы вызываете функцию D, и использует неправильное соглашение о вызовах. Один из способов сделать это правильно:
alias extern(C) void function(void*, const char*) setTitleFunc;
auto clutter_stage_set_title = getSym!(setTitleFunc)("clutter_stage_set_title");
Я не уверен, как заставить это работать без псевдонима все же. DMD отказывается анализировать что-либо с extern(C)
в параметре шаблона:
auto clutter_stage_set_title = getSym!(extern(C) void function(void*, const char*))("clutter_stage_set_title"); //Doesn't work
Кстати: ваша функция cstring
опасна: она возвращает символ *, указывающий, что строка может быть изменена, но это не всегда так: если вы передаете строковый литерал в toStringz
, это может не выделить новую память, но вместо этого верните указатель исходной строки. Строковые литералы находятся в постоянной памяти, поэтому это может привести к проблемам.
Вы можете просто настроить типы функций в соответствии с типами C (const gchar*
в C -> const char*
в D) и напрямую использовать toStringz.