我有一个dll需要我为它设置一个回调函数(实际上它是一个摄像头sdk,它会在收到图片时回调我的函数)。 我想拥有多个(用户输入)相机,但我不能。 因为我应该使用未知数量的回调函数。
简单的方法是创建一个具有回调函数的类(相机)。 但我无法将类成员的指针传递给dll(它只接受(void)(image *))
任何可能的解决方案?
答案 0 :(得分:1)
尝试创建要调用的所有函数对象的全局列表,然后添加一个函数,该函数使用所需数据调用每个回调。像这样:
std::vector<ICallback*> g_callbacks;
void callback_wrapper( image * image )
{
for(unsigned int i=0; i<g_callbacks.size(); ++i)
{
g_callbacks[i]->process( image );
}
}
然后将SDK使用的回调设置为callback_wrapper函数。
答案 1 :(得分:0)
相机SDK是否支持多个相机连接?如果没有,您需要与SDK提供商交谈。
如果SDK支持多重连接,则必须提供在回调函数中识别摄像头的方法。但实际的答案是在SDK本身。什么是“图像”类型,也许它包含摄像机ID?当客户端代码进行回调订阅时,可能会提供相机ID?像这样:
void Callback0(image*); void Callback1(image*); SubscribeImageCallback(0, Callback0); // camera 0 SubscribeImageCallback(1, Callback1); // camera 1
您问题的实际答案取决于相机SDK界面。
答案 2 :(得分:0)
根据操作系统的不同,您可以为每个回调对象创建动态函数。我已经完成了遗留代码的回调,它没有任何设施将值传递给回调。
使用库所期望的类型创建一个小型原型转发函数,然后使用一个容易看到的额外参数调用真实的回调函数
void Call01020304 () {
CallWithValue(0x01020304);
}
编译它并查看程序集的十六进制。这个常数应该是显而易见的。
然后使用VirtualAlloc + PAGE_EXECUTE_READWRITE或mmap + PROT_EXEC分配一些可以执行的内存。分配通常是4K块,因此创建一个类来管理这些功能,因为你将为一次性分配足够的数量。
当您需要具有唯一值的新回调函数时,将具有适当更改值的原型的字节复制到可执行内存中,并将指针作为回调函数返回给它。