У меня есть сторонний API C, который ожидает функцию обратного вызова __stdcall
.
Мой код имеет внешнюю функцию __cdecl
.
Я не могу передать свой указатель на C-API, поскольку они считаются разными типами.
В обход системы типов и с помощью reinterpret_cast<>
естественно возникает ошибка времени выполнения.
Вот пример из здесь:
// C-API
// the stdcall function pointer type:
typedef CTMuint(__stdcall *CTMwritefn)(const void *aBuf, CTMuint aCount, void *aUserData);
// A function needing the callback:
CTMEXPORT void __stdcall ctmSaveCustom(CTMcontext aContext, CTMwritefn aWriteFn, void *aUserData, int *newvertexindex);
^^^^^^^^^^^^^^^^^^^
//////////////////////////////////////////////////////////////////////////////
// C++
CTMuint __cdecl my_func(const void *aBuf, CTMuint aCount, void *aUserData);
// I want to call here:
ctmSaveCustom(context, my_func, &my_data, nullptr);
// ^^^^^^^
Есть ли способ безопасно конвертировать и/или переносить функцию с одним вызовом в другой?
Я нашел способ сделать это, передав брошенную безъядерную лямбду, которая называет вторую захватывающую лямбду. Первый передается как обратный вызов, второй - через void* user_data
. Это работает и безопасно. Но он довольно запутан для чего-то, что кажется таким простым.