Использование метода объекта в качестве обратного вызова функции - PullRequest
2 голосов
/ 23 июня 2011

Я использую библиотеку C, которая имеет функции обратного вызова, такие как:

int DownloadStream(LPCTSTR  host,DWORD channelNumber,NewImage pNewImage);
typedef int  (*NewImage)(BYTE *pData, int nLen,void *returnHandle);

В C я могу позвонить так:

int  CallDownloadStream(LPCTSTR  host,DWORD channelNumber)
{

  int hr = DownloadStream(host,channelNumber,OnNewImage);

  return hr;

}


int OnNewImage(BYTE *pData, int nLen,void *returnHandle)
{

   // able to get data

}

То, что я хочу, это вызвать эти функции как члены класса C ++, такие как:

class MyClass
{

public:


   int  CallDownloadStream(LPCTSTR  host,DWORD channelNumber)
   {

       int hr = DownloadStream(host,channelNumber,OnNewImag);

       return hr;
   }

   int OnNewImage(BYTE *pData, int nLen,void *returnHandle)
   {

   // able to get data

   }
}

Не могу скомпилировать. Можно ли использовать эти функции обратного вызова таким образом? Если да, то как это сделать?

PS: я не контролирую функции обратного вызова в стиле C.

Ответы [ 4 ]

3 голосов
/ 23 июня 2011

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

Редактировать: Это не строго верно.Вы можете использовать статическую переменную, вы можете использовать локальное хранилище потока или JIT функцию.Однако это не общие решения.

1 голос
/ 23 июня 2011

То, что вы делаете, передает указатель на функцию, чтобы функция C могла вызывать его.Другими словами, указатель функции, который вы передаете, должен вызываться из C. Это означает, что он должен быть extern "C" и не может быть типичной функцией-членом.Это может быть static функция-член или автономная функция, но не функция-член класса.

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

Это также означает, что переданная функция не может быть полиморфной.Если вы хотите полиморфное поведение, вам нужно, чтобы все функции обратного вызова, которые вы хотите передать, были определены как static или вне какого-либо класса, и чтобы был вызов функции библиотеки в полиморфной функции.

0 голосов
/ 23 июня 2011

Вы возможно сможете использовать libsigc ++ - http://libsigc.sourceforge.net/ (см. Документацию для mem_fun). Я не знаю точно, что потребуется для того, чтобы он работал правильно. В качестве альтернативы, создайте функцию обратного вызова C, которая просто вызывает соответствующую функцию C ++, используя указатель на объект. (это, наверное, самый простой способ сделать это)

0 голосов
/ 23 июня 2011

Нельзя использовать нестатические функции-члены в качестве функций обратного вызова C.

Таким образом, ответ заключается в использовании статической функции-члена.

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