C++ 函数指针和回调函数

标签 c++ visual-c++

我不是 C++ 专家,我在理解如何将函数指针/回调函数传递给方法时遇到了一些困难。回调定义如下

typedef HRESULT (CALLBACK *PFN_CREATE_XAMLOBJECT)(
    IXRDependencyObject *pExistingXRDO,
    UINT objectId
);

我也尝试通过它的方法定义如下(所有其他参数已删除)

virtual HRESULT STDMETHODCALLTYPE RegisterXamlObject(
    __in    PFN_CREATE_XAMLOBJECT   pfXamlObjectCreation,
) = 0;

我定义传递的函数如下

HRESULT CreateFn(__in IXRDependencyObject *pExistingXRDO, UINT objectId)
{
    return S_OK;
}

我正在尝试按如下方式传递函数指针。

&MyClass::CreateFn

出现以下错误

Error   3   error C2440: 'type cast' : cannot convert from 'HRESULT (__cdecl MyClass::* )(IXRDependencyObject *,UINT)' to 'PFN_CREATE_XAMLOBJECT'

如有任何帮助,我们将不胜感激。

最佳答案

这里有两个问题。

首先,函数指针不能指向成员函数,因为成员函数需要一个this指针来操作。您必须使成员函数static,或使指针成为成员函数指针。

其次,函数指针和函数必须使用相同的调用约定。指针使用CALLBACK,定义为__stdcall

这是一个修改后的函数:

static HRESULT CALLBACK CreateFn(IXRDependencyObject *pExistingXRDO,
                                 UINT objectId)
{
    return S_OK;
}

关于C++ 函数指针和回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8930152/

相关文章:

c++ - 实现 pimpl 习惯用法时出现链接器错误

c++ - 如何在 C++ 中进行内联汇编 (Visual Studio 2010)

c++ - 基本 I/O 在 Visual C++ 2010 中不起作用?

c++ - 字节数组中的项目数

c++ - 如何将无符号参数传递给模板?

c++ - 低质量的H.265 Media Foundation编码?

c++ - 如何更新使用 C++ 中的 ATL OLE 数据库从简单的 SQL 服务器表中获取的行数据

visual-c++ - Log4cxx DailyRollingFileAppender 未滚动

c# - GetFunctionPointerForDelegate 将委托(delegate)中的 String^ 参数转换成什么?

c++ - 算法中的二叉树