gpt4 book ai didi

c++ - 将成员函数传递给需要回调的 C 接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:51:43 24 4
gpt4 key购买 nike

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

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

为了说明这一点:C 接口(interface):

typedef void (f*)(char* param) Callback;
void registerCallback(Callback c);

在 C++ 中的用法:

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

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

最佳答案

据我所知,使它与类的实例和类的成员函数一起工作的唯一方法是:

  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);
}

关于c++ - 将成员函数传递给需要回调的 C 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35703199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com