我正在尝试链接到我的QT应用程序中的外部库。外部库有一个头文件,其中包含我要调用的以下相关代码:
extern VGRABDEVICE_API bool V_AssignFrameSizeCallback(IGrabChannel* pChannel, void* pFunc);
在提供的演示C ++程序中,该程序没有编译问题,下面的相关代码是:
// in main.cpp
void _stdcall MyFrameSizeCallback(T x) {
do_stuff;
}
int main(int argc, char* argv[]) {
IGrabChannel* pChannel0 = something;
V_AssignFrameSizeCallback(pChannel0, MyFrameSizeCallback);
}
我正在尝试将此代码合并到我的QT应用程序中,但是遇到了问题。在我的mainwindow.cpp文件中:
void _stdcall MainWindow::MyFrameSizeCallback(T x) {
do_stuff;
}
void MainWindow::someFunction() {
IGrabChannel* pChannel0 = something;
V_AssignFrameSizeCallback(pChannel0, &MainWindow::MyFrameSizeCallback);
}
我得到的错误是:
error: C2664: 'bool V_AssignFrameSizeCallback(IGrabChannel *,void *)' :
cannot convert argument 2 from 'void (__cdecl MainWindow::* )(T)' to 'void *'
There is no context in which this conversion is possible
我需要做什么?谢谢。
你有两个问题。首先,void*
是数据指针,而不是函数指针。根据C ++标准,预计两者之间的转换不起作用。某些平台提供了更强的保证...例如WindowsGetProcAddress
和* nixdlsym
将两者混为一谈。
其次,您&MainWindow::MyFrameSizeCallback
不是函数指针,而是成员函数指针。调用它需要一个MainWindow
对象,外部库对此一无所知。
您需要向库提供一个普通函数,而不是成员函数。如果您有某种获取MainWindow*
对象指针的方法,则可以调用其成员函数来完成实际工作。有时,库提供了一个“上下文”参数,该参数传递给您的回调。那是放置对象指针的好地方。否则,您将需要将其存储MainWindow*
在全局变量中。如果只有一个,则很容易;而如果有多个,则可以选择std::map<IGrabChannel*, MainWindow*>
。
代码:
MainWindow* MainWindow::the_window;
void MainWindow::MyFrameSizeCallback(T x)
{
do_stuff;
}
void _stdcall MyFrameSizeCallbackShim(T x)
{
MainWindow::the_window->MyFrameSizeCallback(x);
}
void MainWindow::someFunction()
{
IGrabChannel* pChannel0 = something;
the_window = this;
V_AssignFrameSizeCallback(pChannel0, &MyFrameSizeCallbackShim);
}
如果参数x
不是IGrabChannel
,则相应地更改map数据类型和插入逻辑。如果该参数x
不是某种唯一的可预测标识符,则您可能会被限制为仅对一个MainWindow
实例进行回调。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句