gpt4 book ai didi

.net - C3374 : can't take address of 'function' unless creating delegate instance

转载 作者:行者123 更新时间:2023-12-04 23:11:08 26 4
gpt4 key购买 nike

我在使用第三方库注册函数注册回调时遇到了困难。我正在用 C++ CLI 编写,并访问用 C 或 C++ 编写的库。

上面的编译器错误是什么意思?

这是供应商定义的注册功能:

MYCO int WINAPI MyCo_Device_Register_CallbackFunc(LPVOID func, LPVOID lpParam, DWORD mask);

这是供应商定义的回调:
typedef void (CALLBACK* MyCo_Device_CallbackProc)(DWORD ddStatus, LPVOID lpParam);

我的回调函数:
public ref class Device 
{
void CallBackFunc(DWORD ddStatus, LPVOID lpParam) {};
}

我的电话(失败):
MyCo_Device_Register_CallbackFunc((LPVOID) Device::CallBackFunc, nullptr, 0xFFFF);

最佳答案

如果我不得不猜测一下,您正在尝试获取 MANAGED 函数的地址并将其作为 NATIVE 函数指针传递。那根本行不通。要么写一个原生桥(更难而且可能没有优势),或者(这是更简单的方法),创建一个委托(delegate)并使用 Marshal.GetFunctionPointerForDelegate .不要忘记委托(delegate)必须在 native 代码期望回调的时间内保持事件状态,因此您很可能需要将其存储在某个地方。

哦,如果不清楚,则 ref 类或值类中的所有函数都是托管函数。

[编辑] 扩展答案以涵盖评论中的问题。第一步是创建一个匹配的委托(delegate)。对于您提供的功能,它将如下所示:

public delegate void CallbackFuncDelegate(DWORD ddStatus, LPVOID lpParam);

然后,您需要创建一个:
CallbackFuncDelegate del = gcnew CallbackFuncDelegate(CallbackFunc);

如前所述,您应该将该类存储为成员,以确保它不会消失。最后,您需要获取函数指针并将其传递:
MyCo_Device_Register_CallbackFunc((MyCo_Device_CallbackProc) Marshal::GetFunctionPointerForDelegate(del).ToPointer(), 0, 0);

我认为这涵盖了一切。您只需要使用命名空间系统;你应该没事。

关于.net - C3374 : can't take address of 'function' unless creating delegate instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/822582/

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