回调函数(__stdcall)

2 过程语言中的回调(C)


2.1 函数指针
回调在C语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数从而实现回调。因此,要实现回调,必须首先定义函数指针,请看下面的例子:

void Func(char *s);// 函数原型
void (*pFunc) (char *);//函数指针

可以看出,函数的定义和函数指针的定义非常类似。

一般的化,为了简化函数指针类型的变量定义,提高程序的可读性,我们需要把函数指针类型自定义一下。

typedef void(*pcb)(char *);

回调函数可以象普通函数一样被程序调用,但是只有它被当作参数传递给被调函数时才能称作回调函数

 

 3 面向对象语言中的回调(C++)

 回调函数必须是标准调用 __stdcall,用户调用也以以,不过意义不大。回调一定是__stdcall ,但是__stdcall不一定是回调

  许多程序员都发现,利用MFC或者其它的C++应用编写回调函数是非常麻烦的,其根本原因是回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。通过查询资料发现,其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身的指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数但是确有不同的数据成员。由于this指针的作用,使得将一个CALLBACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C++中使用回调函数所遇到的问题。这种方法具有通用性,适合于任何C++。

 方法:

1). 不使用成员函数,直接使用普通C函数,

2). 使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作为回调函数了。

Windows 平台上,_stdcall 是一种函数调用约定,它规定了参数传递和堆栈清理的方式。在使用这种约定的函数的声明中,函数名前面通常会加上一个下划线,例如 _stdcall foo()。而在 C++ 中,类的成员函数是不能直接作为全局函数来使用的,因为类的成员函数需要通过对象来调用。因此,如果要将类的成员函数转换为全局函数,就需要使用回调函数(callback function)的方法。 具体来说,可以定义一个全局函数,该函数的参数包括一个指向类的指针和其他需要的参数,然后在该函数中调用类的成员函数。类的成员函数需要在调用时指定对象,因此可以将对象的指针作为参数传递给全局函数,然后在全局函数中使用该指针来调用类的成员函数。 下面是一个简单的示例代码,演示了如何将类的成员函数转换为全局函数: ```cpp class MyClass { public: void _stdcall myFunc(int param) { // do something } }; // 定义一个全局函数作为回调函数 void _stdcall myCallback(MyClass* obj, int param) { obj->myFunc(param); } int main() { MyClass obj; // 将类的成员函数转换为全局函数 void (_stdcall *func)(MyClass*, int) = &myCallback; // 调用全局函数 func(&obj, 123); return 0; } ``` 在上面的示例代码中,我们首先定义了一个类 MyClass,其中包含一个成员函数 myFunc。然后定义了一个全局函数 myCallback,该函数接受一个指向 MyClass 对象的指针和一个整型参数,然后在该函数中调用 MyClass 的成员函数 myFunc。在主函数中,我们将 myCallback 转换为一个函数指针 func,并将 MyClass 对象的指针和参数传递给该函数指针来调用 MyClass 的成员函数 myFunc。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值