Затирается адрес возврата в колбеке
От: ak239  
Дата: 15.12.13 11:06
Оценка:
Добрый день.

Существует библиотека (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++'
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.