typedef struct _AEECallback AEECallback;
struct _AEECallback
{
AEECallback *pNext; //保留,并且调用程序不得修改此成员
void *pmc; //保留,并且调用程序不得修改此成员
PFNCBCANCEL pfnCancel; //回调被取消时,指向回调处理程序所调用函数的指针。调用程序必须将此指针设置为 NULL。
void *pCancelData; //传递给 pfnCancel 的数据。 调用程序不得修改此成员。
PFNNOTIFY pfnNotify; //AEE 调用的回调函数。调用程序必须将此指针设为指向 AEE 回调处理程序所调用的函数。
void *pNotifyData; //传递给 pfnNotify 的数据,调用程序必须将此指针设为指向须传递给 pfnNotify函数的数据。
void *pReserved; //保留,并由回调处理程序使用此成员
};
该结构体,前两个参数pNext和pmc都是不可修改的,是系统维护其值;pfnCancel和pCancelData是在取消回调时使用的;pfnNotify和pNotifyData是在回调时使用的;最后一个pReserved是保留参数,可以存储任何数据。
AEECallback_Setup函数:
1、通过CALLBACK_Cancel宏调用了pcb中的pfnCancel函数。
2、给pfnCancel赋值,给pCancelData赋值
3、给pReserved赋值,其值是pfnCancelNotify
备注:猜想该函数的功能就是为pcb结构体赋值,按次序分别是pfnCancel、pCancelData、pReserved
static void AEECallback_Setup(AEECallback *pcb, PFNCBCANCEL pfnCancel,
void *pvCancel, PFNSCHEDNOTIFY pfnCancelNotify)
{
CALLBACK_Cancel(pcb);
pcb->pfnCancel = pfnCancel;
pcb->pCancelData = pvCancel;
pcb->pReserved = (void *)pfnCancelNotify;
}
AEECallback_Fire函数:
1、把参数强制类型转换为AEECallback类型
2、把pfnCancel赋值为0
3、调用pfnNotify函数
备注:猜想该函数的功能就是调用notify函数
static void AEECallback_Fire(void *pvCxt)
{
AEECallback *pcb = (AEECallback *)pvCxt;
pcb->pfnCancel = 0;
pcb->pfnNotify(pcb->pNotifyData);
}
AEECallback_CancelNotify函数:
1、从pReserved指针中取出保存的pfnCancelNofity,并且强制类型转换,猜想该成员的职责就是保存一些需要保存的指针
2、把pfnCancel置为0
3、调用pfnCancelNotify函数
备注:该函数其实就是要调用其中的CancelNotify函数,只是该函数指针保存在了void类型的pReserved成员里头,需要进行强制类型转换,注意的一点是在调用notify类函数的时候都把pfcCancel置为了0,不知道是何用意
static void AEECallback_CancelNotify(AEECallback *pcb)
{
PFNSCHEDNOTIFY pfnCancelNotify = (PFNSCHEDNOTIFY)pcb->pReserved;
pcb->pfnCancel = 0;
pfnCancelNotify(pcb->pCancelData, AEECallback_Fire, pcb);
}
AEECallback_SchedNotifyWait函数:
1、先通过AEECallback_Setup函数来填充pcb结构体
2、再调用pfnSched函数
备注:不明白这个函数什么意思
void AEECallback_SchedNotifyWait(AEECallback *pcb, void *pSchedNotifyObj,
PFNSCHEDNOTIFY pfnSched,
PFNSCHEDNOTIFY pfnCancel)
{
AEECallback_Setup(pcb, AEECallback_CancelNotify, pSchedNotifyObj, pfnCancel);
pfnSched(pSchedNotifyObj, AEECallback_Fire, pcb);
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiyucn/archive/2006/01/22/586349.aspx
分享到:
相关推荐
cdev结构体及其相关函数 ,主要是针对内核2.6系列的相关函数说明!
结构体可以看做是C语言中的类 但是结构体中不能封装函数,只能有数据成员 这个程序演示了如何像c++的类一样在结构体中增加函数 如果有错误,欢迎交流
把c++的结构体、数据类型、函数定义转换成对应的c#表达,很强大。
串口编程函数和结构体串口编程函数和结构体
结构体是 C 语言中一个...但是在 C 语言的结构体成员却不能是函数,针对这一问题,本文分析探讨了将函数指针作为结构体成员的理论和方法。通过在结构体中定义函数指针类型的成员,从而实现了在结构体中使用函数的目的。
将多个变量放到一个结构体中,减少函数传递时的多个参数传进传出的复杂性 结构体传进函数时,是以引用的形式传入的,不是以指针的形式。
C语言用结构体指针作函数参数
2、原理:为了提高代码的安全性,可以采用把把函数名隐藏在结构体里,以函数指针成员的形式存储。 编译后,只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛. 3、应用场景:签名函数
WinPcap下的主要结构体和主要函数.doc
结构体的创建,链表的建立,大一的新生转转吧
行业-电子-凝聚纺丝结构体及其制造方法和使用凝集纺丝结构体的电线的说明分析.rar
利用结构体和重载函数实现利用不同字段存储并查询学生信息。 学生信息包括:学号,姓名,性别,专业,班级,寝室。
主要介绍了详解C语言结构体中的函数指针,文中对函数指针的基本概念也有讲解,需要的朋友可以参考下
通过函数实现对结构体数组赋值和打印全部数组内容或单个数组元素的功能。
对于linux/unix c的初学者来说,读代码的时候经常会想知道一些系统调用和系统用的结构体的定义,使用这个脚本就可以查出结构体和函数的定义。
(1)编写一个赋值学生结构体成员的函数; (2)编写一个打印学生结构体成员的函数; 四、实验结果与数据处理 五、分析与讨论 一、实验目的及要求 本次实验目的是通过上机练习,认真复习C语言的基本知识点。要求...
C语言基础语法试题,对于想动手练练的新手相当有用。包括基础概念、函数、指针、结构体等等。
使c语言初学者对结构图可以有基本的认识,主要面向c 语言刚刚起步的学习。
描述:为了解决java与C结构通信过程中结构体解析问题。 主要功能:能友好的用java处理任何发送的C结构体对象,并且能发送java对象转换成C结构体接收的二进制。 功能说明 1、基于spring框架开发 2、对于结构体定义...
蜂窝结构体及其制造方法与流程.docx