回调函数和函数指针调用实现机制及其区别
2012-08-30 15:07
309 查看
一个函数在此处声明并使用(一般是低层,比如DLL),在其它地方实现(一般是上层,应用程序),这种函数就是回调函数。与回调函数相反的是正调函数(一般不这么叫),也就是一般OS低层提供给上层的API函数,让上层什么时候想使用这个函数,就直接调用这个函数。
回调函数是自动被调用的,用户不会直接调用它,但用户会填加其中的代码具体实现。正调函数,用户会主动地调用(或使用)的。
typedef int (__cdecl *PLATE_NO_CALLBACK )( void *pFirstParameter, DWORD32 dwCarID, PSTR pcPlateNo, DWORD64 dwTimeMs)
typedef int ( *PLATE_NO_CALLBACK )( void *pFirstParameter, DWORD32 dwCarID, PSTR pcPlateNo, DWORD64 dw64TimeMs );
static int PlateNoCallBack(void *pFirstParameter, DWORD32 dwCarID, PSTR pcPlateNo, DWORD64 dw64TimeMs);//声明
int CWJSWDLLApp::PlateNoCallBack(void *pFirstParameter, DWORD32 dwCarID, PSTR pcPlateNo, DWORD64 dw64TimeMs)//实现
{
//读取车牌号
............ //函数体
return 0;
}
然后在应用程序中调用回调函数:是通过函数指针的方式调用的
wSetHvCallBack(IdentInfo[i].HvHandle, CWJSWDLLApp::PlateNoCallBack, &IdentInfo[i], 0, _TYPE_PLATE_STR)//调用
typedef HRESULT (_cdecl *tSetHvCallBack)(HV_HANDLE, void *, void *, WORD, WORD);
然后在应用程序中声明一个函数变量:
tSetHvCallBack wSetHvCallBack;
其次获取函数变量的地址:
wSetHvCallBack = (tSetHvCallBack)GetProcAddress(m_DllHandle, "SetHvCallBack");//
最后使用此函数变量:
wSetHvCallBack(IdentInfo[i].HvHandle, CWJSWDLLApp::PlateNoCallBack, &IdentInfo[i], 0, _TYPE_PLATE_STR)//使用
回调函数是自动被调用的,用户不会直接调用它,但用户会填加其中的代码具体实现。正调函数,用户会主动地调用(或使用)的。
在动态库中声明函数原型:
HV_API HRESULT__cdecl SetHvCallBack( HV_HANDLE hHandle, void *pFunction, void *pFirstParameter, WORD wVideoID, WORD wStream )typedef int (__cdecl *PLATE_NO_CALLBACK )( void *pFirstParameter, DWORD32 dwCarID, PSTR pcPlateNo, DWORD64 dwTimeMs)
应用程序声明函数原型:
typedef HRESULT (_cdecl *tSetHvCallBack)(HV_HANDLE, void *, void *, WORD, WORD);typedef int ( *PLATE_NO_CALLBACK )( void *pFirstParameter, DWORD32 dwCarID, PSTR pcPlateNo, DWORD64 dw64TimeMs );
举例说明二者的调用机制:
回调函数的调用:
首先要在应用程序中声明并实现回调函数:static int PlateNoCallBack(void *pFirstParameter, DWORD32 dwCarID, PSTR pcPlateNo, DWORD64 dw64TimeMs);//声明
int CWJSWDLLApp::PlateNoCallBack(void *pFirstParameter, DWORD32 dwCarID, PSTR pcPlateNo, DWORD64 dw64TimeMs)//实现
{
//读取车牌号
............ //函数体
return 0;
}
然后在应用程序中调用回调函数:是通过函数指针的方式调用的
wSetHvCallBack(IdentInfo[i].HvHandle, CWJSWDLLApp::PlateNoCallBack, &IdentInfo[i], 0, _TYPE_PLATE_STR)//调用
函数指针的调用
首先在应用程序中声明函数指针类型:typedef HRESULT (_cdecl *tSetHvCallBack)(HV_HANDLE, void *, void *, WORD, WORD);
然后在应用程序中声明一个函数变量:
tSetHvCallBack wSetHvCallBack;
其次获取函数变量的地址:
wSetHvCallBack = (tSetHvCallBack)GetProcAddress(m_DllHandle, "SetHvCallBack");//
最后使用此函数变量:
wSetHvCallBack(IdentInfo[i].HvHandle, CWJSWDLLApp::PlateNoCallBack, &IdentInfo[i], 0, _TYPE_PLATE_STR)//使用
相关文章推荐
- Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用
- 【Android开发经验】利用反射机制,获取类的字段、方法、并实现简单调用
- python使用multiprocessing模块实现带回调函数的异步调用方法
- Linux系统调用的实现机制分析
- Linux 系统调用的实现及其汇编代码的嵌入到C中
- ASP.NET MVC传递Model到视图的多种方式总结(二)__关于ViewBag、ViewData和TempData的实现机制与区别
- 第51讲:Scala中链式调用风格的实现代码实战及其在Spark编程中的广泛运用学习笔记
- iOS中Objective-C与JavaScript之间相互调用的实现(实现了与Android相同的机制)
- COM中的可连接对象与连接点机制及其MFC程序实现
- 调用机制:回调函数、同步调用、异步调用
- 使用反射机制实现jQuery调用ashx类中的指定方法
- java内省机制 + 内省是什么 + 内省实现方式 + 和反射的区别
- linux 内核同步机制-自旋锁与信号量及其区别
- COM中的可连接对象与连接点机制及其MFC程序实现
- loadView方法的实现(self.view调用addSubview方法与self.view=的区别)
- java回调机制及其实现
- Mybatis之#{}和${}的区别及其实现方式
- linux内核剖析(六)Linux系统调用详解(实现机制分析)
- c 动态链接库 静态链接库 区别练习,及其调用方法
- Linux系统调用的实现机制分析