- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试链接到我的 QT 应用程序中的外部库。外部库有一个头文件,其中包含我正在尝试调用的以下相关代码:
extern VGRABDEVICE_API bool V_AssignFrameSizeCallback(IGrabChannel* pChannel, void* pFunc);
在提供的demo 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++ 标准,两者之间的转换预计不会起作用。某些平台提供更强的保证...例如 Windows GetProcAddress
和 *nix dlsym
将两者混合。
接下来,您的 &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
进行回调实例。
关于c++ - 将 void(__cdecl MyClass::*)() 转换为 void * 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27324265/
这是我正在迁移到 VS2017 的代码库的简化版本。以下代码在 VS2013 和 Intel C++ 编译器 2017 更新 4 中编译,但在 VS2013 中不编译。 #include temp
我想调用一个返回 struct 的函数,这个函数有 __cdecl 调用约定。 __cdecl 调用约定如何返回一个struct? 最佳答案 视情况而定。 没有统一的方法。 简单的函数返回,比如int
我想调用一个返回 struct 的函数,这个函数有 __cdecl 调用约定。 __cdecl 调用约定如何返回一个struct? 最佳答案 视情况而定。 没有统一的方法。 简单的函数返回,比如int
我想在 MPI 中使用 AES 算法。 我用 Visual C++ 编写代码。编译代码时出现此错误: unresolved external symbol "void __cdecl BTM(int,
我的公司向第三方提供了一个 DLL,为他们提供了可用于连接到我们的应用程序的 API 函数。 DLL是用VC9编写的,API函数使用了VC默认的调用约定(__cdecl)。第三方已围绕此接口(inte
显示如何使用 MFC 创建线程的示例代码将线程函数声明为静态函数和 __cdecl。为什么需要后者? Boost 线程不理会这个约定,所以它只是一个时代错误吗? 例如(MFC): static __c
在 Visual Studio 2019 中,我编写了以下测试代码,但结果让我感到困惑。 #include using namespace std; template int call(T x, F
在了解了 __cdecl 后,我对堆栈清理感到困惑。 阅读 __cdecl 将弹出堆栈参数 ( https://msdn.microsoft.com/en-us/library/zkwh89ks.as
__stdcall 和 __cdecl 调用约定规定函数名必须在前面加上下划线: C (__cdecl) The same constraints apply to the 32-bit world
我正在尝试用 C (VS2010) 实现一些简单的功能。应该很容易。但是,我收到了 error LNK2019: unresolved external symbol "1>test01.obj :
在函数声明中使用 _cdecl_ 与 __cdecl(1 个下划线 vs 2 个下划线)有什么不同吗? 我正在使用 Visual Studio 2017 及其附带的标准工具。 最佳答案 __cdecl
只是测试 __cdecl 调用约定。 这是一个 cmake 项目,只有 1 个源文件: #include #define CALL_CONVENTION __cdecl void CALL_CONV
我目前正在使用 WSA 编写一个 tcp/ip 服务器。经过一些故障排除后,我的一个 friend 说我应该使用 bool __cdecl winsock_server ( void ) 而不是 bo
我正在学习C语言,在学习的过程中我发现了一行代码,这对我来说是全新的和陌生的void PullDown(char **, int, void (__cdecl **)(void));我只知道第一个和第
我正在运行 ANTLR 4.2 并使用来自的规范 C 语法: https://github.com/antlr/grammars-v4/tree/master/c 我正在执行以下步骤:(使用 ANTL
#define boo(fmt, ...) SomethingToDo(fmt, __VA_ARGS__) void foo(PCSTR fmt, ...) { // some other
我发现了这个: Because the stack is cleaned by the called function, the __stdcall calling convention create
我正在为第三方应用程序编写 DLL。主要软件工程师提到该应用程序使用 __cdecl (/Gd) 调用约定。我需要确保使用它。 另外,第三方提供给我一个C++ DLL骨架,导出函数如下: #ifdef
我听一些人说 __fastcall 比 __cdecl 和 __stdcall 快,因为它把两个参数放在寄存器中,而不是一个其他电话;但是,另一方面,这不是 C 中使用的标准。 我想知道是什么让 __
我今天的面试中有这样一个问题。 #include int main(void) { char *s="123456790"; printf("%c,%c",*(char *)((in
我是一名优秀的程序员,十分优秀!