C ++ Несколько функций обратного вызова - PullRequest
0 голосов
/ 19 июля 2010

У меня есть dll, которая требует, чтобы я установил для него функцию обратного вызова (на самом деле это sdk камеры, и он будет вызывать мою функцию при получении изображения). Я хочу иметь несколько камер (пользовательский ввод), но не могу. Поскольку я должен сделать неизвестное количество функций обратного вызова.

Самый простой способ - создать класс (камеру) с функцией обратного вызова. но я не могу передать указатель члена класса в dll (он принимает только (void) (image *))

Любое возможное решение?

Ответы [ 3 ]

1 голос
/ 19 июля 2010

Попробуйте создать глобальный список всех вызываемых объектов функции, затем добавьте одну функцию, которая вызывает каждый из обратных вызовов с необходимыми данными.Примерно так:

std::vector<ICallback*> g_callbacks;

void callback_wrapper( image * image )
{
  for(unsigned int i=0; i<g_callbacks.size(); ++i)
  {
     g_callbacks[i]->process( image );
  }
}

Затем вы устанавливаете обратный вызов, используемый SDK, на функцию callback_wrapper.

0 голосов
/ 19 июля 2010

В зависимости от операционной системы вы можете создавать динамические функции для каждого объекта обратного вызова. Я сделал именно это для обратных вызовов из унаследованного кода, которые не имели возможности передать значение обратному вызову.

Создайте небольшую функцию перенаправления прототипов с типом, ожидаемым библиотекой, который затем вызывает реальную функцию обратного вызова с легко видимым дополнительным параметром

void Call01020304 () {
    CallWithValue(0x01020304);
}

Скомпилируйте его и посмотрите на гекс для сборки. Должно быть очевидно, где константа.

Затем вы используете VirtualAlloc + PAGE_EXECUTE_READWRITE или mmap + PROT_EXEC для выделения некоторой памяти, которую можно выполнить. Распределение обычно выполняется в блоках 4K, поэтому создайте класс для управления функциями, так как вы будете распределять достаточно для многих за один раз.

Когда вам нужна новая функция обратного вызова с уникальным значением, скопируйте байты прототипа с соответствующим измененным значением в вашу исполняемую память и верните указатель на нее как функцию обратного вызова.

0 голосов
/ 19 июля 2010

Camera SDK поддерживает подключение нескольких камер? Если нет, вам нужно поговорить с провайдером SDK.

Если SDK поддерживает множественное соединение, он должен обеспечивать способ распознавания камеры в функции обратного вызова. Но фактический ответ находится в самом SDK. Какой тип изображения, может быть, он содержит идентификатор камеры? Может быть, идентификатор камеры предоставляется, когда клиентский код делает подписку на обратный звонок? Примерно так:

void Callback0(image*);
void Callback1(image*);

SubscribeImageCallback(0, Callback0);  // camera 0
SubscribeImageCallback(1, Callback1);  // camera 1

Фактический ответ на ваш вопрос зависит от интерфейса SDK камеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...