将成员函数传递给需要回调的 C 接口

Dmi*_*try 5 c c++ std

我有一个带有普通 C 接口的旧 .dll,它在完成某些工作时需要回调来调用。它采用的回调类型为void (f*)(char* arg)

我正在寻找一种在那里传递 C++ 函数对象的技巧,以便使用存储在某处的“this”指针调用回调,例如绑定,但简单的绑定不起作用

为了说明这一点: C 接口:

typedef void (f*)(char* param) Callback;
void registerCallback(Callback c);
Run Code Online (Sandbox Code Playgroud)

C++ 中的用法:

class A
{
    void func1()
    {
         registerCallback(std::bind(&A::func2, _1, this)); // obviously doens't work
    }

    void func2(char* param)
    { ... }
};
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 3

据我所知,使用类的实例和类的成员函数来实现此操作的唯一方法是:

  1. 将指向对象的指针存储在全局变量中。
  2. 注册一个非成员函数。
  3. 使用全局变量从非成员函数调用成员函数。
class A
{
    void func1();

    void func2(char* param)
    { ... }
};

// Global pointer
A* aPtr = NULL;

// Non-member function.
// extern "C" is probably needed if the older DLL is expecting
// an unmangled C function pointer.
extern "C" void globalFunc2(char* param)
{
   if ( aPtr == NULL )
   {
      // Deal with error
   }
   else
   {
      aPtr->func2(param);
   }
}

void A::func1()
{
    aPtr = this;
    registerCallback(globalFunc2);
}
Run Code Online (Sandbox Code Playgroud)