如何在MFC中创建指向回调函数的指针 [英] How to create pointer to callback function in MFC

查看:123
本文介绍了如何在MFC中创建指向回调函数的指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用MFC中的演示生物公制项目

在msdn上我们有一些回调函数但是我们需要创建指向成员函数的指针如何操作。



出现此错误:



错误1错误C2440:'=':无法转换为'void(__stdcall CBioMetricApplicationDlg: :*)(PVOID,HRESULT,WINBIO_UNIT_ID,PWINBIO_BIR,SIZE_T,WINBIO_REJECT_DETAIL)'到'无效(__thiscall CBioMetricApplicationDlg :: *)(PVOID,HRESULT,WINBIO_UNIT_ID,PWINBIO_BIR,SIZE_T,WINBIO_REJECT_DETAIL)'



我尝试过:



 //在头文件CBioMetricApplicationDlg.h中。 .. 

VOID CALLBACK CaptureCallback(
__in_opt PVOID CaptureCallbackContext,
__ in HRESULT OperationStatus,
__in WINBIO_UNIT_ID UnitId,
__in_bcount(SampleSize)PWINBIO_BIR Sample,
__in SIZE_T SampleSize,
__in WINBIO_REJECT_DETAIL RejectDetail
);


VOID CALLBACK(CBioMetricApplicationDlg :: * pCaptureCallback)(
__in_opt PVOID CaptureCallbackContext,
__in HRESULT OperationStatus,
__in WINBIO_UNIT_ID UnitId,
__in_bcount(SampleSize)PWINBIO_BIR示例,
__在SIZE_T SampleSize中,
__in WINBIO_REJECT_DETAIL RejectDetail
);





 //在cpp文件中CBioMetricApplicationDlg.cpp 
//在OnInitDialog()

// TODO:在这里添加额外的初始化
pCaptureCallback =& CBioMetricApplicationDlg :: CaptureCallback;

解决方案

通常使用 typedef 这样的函数因为它可以更容易地声明指针。



对于你的情况,请参阅 PWINBIO_CAPTURE_CALLBACK函数指针(Windows) [ ^ ]:

 typedef VOID(CALLBACK * PWINBIO_CAPTURE_CALLBACK)(
_In_opt_ PVOID CaptureCallbackContext,
_In_ HRESULT OperationStatus,
_In_ WINBIO_UNIT_ID UnitId,
_In_ PWINBIO_BIR示例,
_In_ SIZE_T SampleSize,
_In_ WINBIO_REJECT_DETAIL RejectDetail
);



然后将变量声明为

 PWINBIO_CAPTURE_CALLBACK pCaptureCallback; 





我不确定 CALLBACK 是如何解决的。但似乎它不包含 static 。因为回调函数必须是静态的,所以声明为类成员函数必须是

 / * CBioMetricApplicationDlg.h * / 
静态VOID CALLBACK CaptureCallback(
__in_opt PVOID CaptureCallbackContext,
__in HRESULT OperationStatus,
__in WINBIO_UNIT_ID UnitId,
__in_bcount(SampleSize)PWINBIO_BIR示例,
__in SIZE_T SampleSize,
__in WINBIO_REJECT_DETAIL RejectDetail
) ;

要在回调函数中访问该类,请将作为上下文参数传递:

 / * CBioMetricApplicationDlg.cpp * / 
hr = WinBioCaptureSampleWithCallback(
sessionHandle,
WINBIO_NO_PURPOSE_AVAILABLE,
WINBIO_DATA_FLAG_RAW,
CaptureSampleCallback,
this);

并在回调函数中转换参数:

 / * CBioMetricApplicationDlg.cpp * / 
VOID CBioMetricApplicationDlg :: CaptureCallback(
__in_opt PVOID CaptureCallbackCon text,
__in HRESULT OperationStatus,
__in WINBIO_UNIT_ID UnitId,
__in_bcount(SampleSize)PWINBIO_BIR示例,
__in SIZE_T SampleSize,
__in WINBIO_REJECT_DETAIL RejectDetail

{
CBioMetricApplicationDlg * pThis = reinterpret_cast< CBioMetricApplicationDlg *>(CaptureCallbackContext);
//使用pThis访问班级成员
// ...
}

[/ EDIT]


地址对象(this)是任何类方法的第一个隐式parm。所以尝试将pcapturecallback声明为:

Void回调(cbiometricapplicationdlg :: * pcapturecallback)(cbiometricapplicationdlg * thisobj,__ in__opt pvoid capturecallbackcontext,<其余的params>);

是否这样做工作

I'm working on demo bio metric project in MFC
On msdn we have some callback functions but for use that we need to create pointer to member function how to do it.

Getting this error:

Error 1 error C2440: '=' : cannot convert from 'void (__stdcall CBioMetricApplicationDlg::* )(PVOID,HRESULT,WINBIO_UNIT_ID,PWINBIO_BIR,SIZE_T,WINBIO_REJECT_DETAIL)' to 'void (__thiscall CBioMetricApplicationDlg::* )(PVOID,HRESULT,WINBIO_UNIT_ID,PWINBIO_BIR,SIZE_T,WINBIO_REJECT_DETAIL)'

What I have tried:

// in header file CBioMetricApplicationDlg.h ...

VOID CALLBACK CaptureCallback(
__in_opt PVOID CaptureCallbackContext,
__in HRESULT OperationStatus,
__in WINBIO_UNIT_ID UnitId,
__in_bcount(SampleSize) PWINBIO_BIR Sample,
__in SIZE_T SampleSize,
__in WINBIO_REJECT_DETAIL RejectDetail
);


VOID CALLBACK(CBioMetricApplicationDlg:: *pCaptureCallback) (
__in_opt PVOID CaptureCallbackContext,
__in HRESULT OperationStatus,
__in WINBIO_UNIT_ID UnitId,
__in_bcount(SampleSize) PWINBIO_BIR Sample,
__in SIZE_T SampleSize,
__in WINBIO_REJECT_DETAIL RejectDetail
);



// in cpp file CBioMetricApplicationDlg.cpp
//in the OnInitDialog() 

// TODO: Add extra initialization here
pCaptureCallback = &CBioMetricApplicationDlg::CaptureCallback;

解决方案

It is common to use a typedef for such functions because it makes it easier to declare pointers.

For your case see PWINBIO_CAPTURE_CALLBACK function pointer (Windows)[^]:

typedef VOID ( CALLBACK *PWINBIO_CAPTURE_CALLBACK)(
  _In_opt_ PVOID                CaptureCallbackContext,
  _In_     HRESULT              OperationStatus,
  _In_     WINBIO_UNIT_ID       UnitId,
  _In_     PWINBIO_BIR          Sample,
  _In_     SIZE_T               SampleSize,
  _In_     WINBIO_REJECT_DETAIL RejectDetail
);


Then declare the variable as

PWINBIO_CAPTURE_CALLBACK pCaptureCallback;


[EDIT]
I was not sure how CALLBACK is resolved. But it seems that it does not contain static. Because callback functions must be static, the declaration as class member function must be

/* CBioMetricApplicationDlg.h */
static VOID CALLBACK CaptureCallback(
    __in_opt PVOID CaptureCallbackContext,
    __in HRESULT OperationStatus,
    __in WINBIO_UNIT_ID UnitId,
    __in_bcount(SampleSize) PWINBIO_BIR Sample,
    __in SIZE_T SampleSize,
    __in WINBIO_REJECT_DETAIL RejectDetail
    );

To get access to the class within the callback function pass this as context parameter:

/* CBioMetricApplicationDlg.cpp */
hr = WinBioCaptureSampleWithCallback(
    sessionHandle,
    WINBIO_NO_PURPOSE_AVAILABLE,
    WINBIO_DATA_FLAG_RAW,
    CaptureSampleCallback,
    this);

and cast the parameter in the callback function:

/* CBioMetricApplicationDlg.cpp */
VOID CBioMetricApplicationDlg::CaptureCallback(
    __in_opt PVOID CaptureCallbackContext,
    __in HRESULT OperationStatus,
    __in WINBIO_UNIT_ID UnitId,
    __in_bcount(SampleSize) PWINBIO_BIR Sample,
    __in SIZE_T SampleSize,
    __in WINBIO_REJECT_DETAIL RejectDetail
    )
{
    CBioMetricApplicationDlg *pThis = reinterpret_cast<CBioMetricApplicationDlg*>(CaptureCallbackContext);
    // Use pThis to access class members
    // ...
}

[/EDIT]


The address of the object (this)is the first Implicit parm to any class method. So try declaring pcapturecallback as:
Void callback (cbiometricapplicationdlg::*pcapturecallback)(cbiometricapplicationdlg *thisobj, __in__opt pvoid capturecallbackcontext, <rest of params>);
does it work?


这篇关于如何在MFC中创建指向回调函数的指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆