使用对象方法作为函数回调

时间:2011-06-23 15:14:39

标签: c++ c callback

我正在使用具有回调函数的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 个答案:

答案 0 :(得分:3)

无法完成。如果C函数没有提供用户提供的参数指针,其中 在C中是惯用的,那么你就不能这样做。

编辑:这不是严格为真。您可以使用静态变量,可以使用线程本地存储,也可以使用JIT函数。但是,这些不是一般情况下的解决方案。

答案 1 :(得分:1)

你正在做的是传递函数指针,以便C函数可以调用它。换句话说,您传递的函数指针必须可以从C调用。这意味着它必须是extern "C",并且不能是典型的成员函数。它可以是static成员函数,也可以是独立函数,但不是类成员函数。

这意味着回调函数不会影响类数据成员。它可以影响静态成员数据,全局数据或其他任何内容,但不影响类成员数据。如果这是你想要的效果,你需要提供某种非类缓冲区并自己移动数据。

这也意味着传递的函数不能是多态的。如果您需要多态行为,则需要将要传递的所有回调函数定义为static或在任何类之外,并在多态函数中调用库函数。

答案 2 :(得分:0)

您不能将非静态成员函数用作C回调函数。

所以答案是使用静态成员函数。

答案 3 :(得分:-1)

可能能够使用libsigc ++ - http://libsigc.sourceforge.net/(查看mem_fun的文档)。我不知道为了让它正常工作需要什么。或者,创建一个C回调函数,它只需使用指向对象的指针调用正确的C ++函数。 (这可能是最简单的方法)