我正在使用具有回调函数的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风格的回调函数。
答案 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 ++函数。 (这可能是最简单的方法)