Добрый день.
Существует библиотека (AntTweakBar), которая позволяет передавать указатель на функцию, которая должна вызываться для получения значения.
Функция имеет следующий typedef:
typedef void (__stdcall * TwGetVarCallback)(void *value, void *clientData);
Внутри своей dll я передаю внутрь этой функции — соответствующую статическую функцию класса:
static void TW_CALL GetData(void* val, void* clientdata);
Все работает, если реализовать функцию следующим образом:
void TW_CALL ATBVar::GetData(void* val, void* clientdata)
{
*static_cast<GLfloat*>(val) = 1.0;
}
Все не работает, если реализовать эту функцию:
void TW_CALL ATBVar::GetData(void* val, void* clientdata)
{
static_cast<ATBVar*>(clientdata)->get(clientdata);
}
В данном случае в clientdata сохранен указатель на производный класс, а функция get является виртуальной функцией базового класса.
Внутри библиотеки вызов функции осуществляется следующим образом:
if( UseGet ){
std::cout << "ValueToDouble() 0.0" << std::endl;
m_GetCallback(&Val, m_ClientData);
std::cout << "ValueToDouble() 0.1" << std::endl;
}
Без вызова виртуальной функции — все работает нормально, т.е. выводятся обе отладочные строки.
С вызовом виртуальной функции — выводится только первая строка и работа AntTweakBar становится абсолютно некорректной.
Я предполагаю, что затирается код возврата из статической функции при вызове виртуальной функции. Если это действительно так, то как быть в этой ситуации? Либо в чем может быть дело?
Планирую сейчас протестировать, что будет, если избавиться от виртуальных функций и вызывать просто функцию класса, может в этом дело.
17.12.13 15:38: Перенесено из 'C/C++'