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

Using an object method as a function callback

本文关键字:函数 回调 方法 对象      更新时间:2023-10-16

我使用的是一个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
   }
}

我无法编译它。可以用那种方式使用那些回调函数吗?如果是这样,该怎么做?

附言:我无法控制原来的C风格回调函数。

无法完成。如果C函数不提供用户提供的参数指针,而在C中是惯用的,则不能执行此操作。

编辑:这不是严格意义上的。可以使用静态变量,可以使用线程本地存储,也可以JIT函数。然而,这些并不是一般情况下的解决方案。

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

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

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

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

因此,答案是使用静态成员函数。

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