如何通过一个非静态部件的功能作一回?
-
21-09-2019 - |
题
io_iterator_t enumerator;
kern_return_t result;
result = IOServiceAddMatchingNotification(
mNotifyPort,
kIOMatchedNotification,
IOServiceMatching( "IOFireWireLocalNode" ),
serviceMatchingCallback,
(void *)0x1234,
& enumerator );
serviceMatchingCallback((void *)0x1234, enumerator);
如果我宣布serviceMatchinCallback作为静态然后它的工作原理,但我不想要它是静态的。有没有办法通过它的非静态的回拨功能?
谢谢你
解决方案
您可以保持静态,但使用用户数据存储除了你想要的任何其他用户数据的this
指针(由它们包装成一个结构,例如),然后通过调用从静态版本的特定对象回调调用this->someCallback
(其中this
当然是存储在用户数据的指针)。
其他提示
原型 IOServiceMatchingCallback 是不兼容的一个非静态的类方法(和在技术上是 不兼容的一个静态的类方法),所以你不是要能够使用。
但幸运的是 IOServiceAddMatchingNotification 支持方面的指针(或者因为他们叫它,refCon),这将允许您可以创建一个咚,不依靠的全球数据。
你需要定义一个回调与相容的联系(即外部"C")。这一功能将会投你的refCon到您的对象的指针,然后前进的呼吁,以实例的方法:
extern "C"
void io_callback(void *refcon, io_iterator_t iterator)
{
myclass *c = static_cast<myclass *>(refcon);
c->real_callback(iterator);
}
然后,当你打电话IOServiceAddMatchingNotification,确保通过一个指向你的对象refCon(在这里我假设你叫IOServiceAddMatchingNotification从一个部件的功能和你有一本指针):
result = IOServiceAddMatchingNotification(
mNotifyPort,
kIOMatchedNotification,
IOServiceMatching( "IOFireWireLocalNode" ),
serviceMatchingCallback,
this,
&enumerator );
不直接
在非静态函数指针(被称为成员函数指针)具有一个隐藏的“本”参数,以便该类型不匹配。静态函数没有this指针。
要解决这个问题,你需要能够在其中是要作为一个回调使用对象的this指针用户数据项通过。然后,指定传递用户数据的静态成员,将其转换为指针对类对象并调用非静态成员就可以了。
看着你已经发布的代码,这是很难说,如果有一个用户数据对象,可能是最后一次,但是=一个参数。
没有,一个非静态成员所期望的对象,并且主叫方(呼叫衬垫)没有且不会提供一个。
没有。非静态方法需要一个对象进行操作。如果你仅仅通过该方法,您还需要一些方法来判断哪些对象的函数调用的方法上。
一个非static
函数有一个隐式this
参数,并且因此将具有回调的签名错误。
很抱歉,没有简单的方法来避免跳转岛
如果你把这个线在构造函数(或任何实例方法),那么你应该能够做到this.instanceMethod()来引用实例方法。
修改强> 我只注意到你正在使用的用户空间由于IOKit API,而不是KEXT的一面,这使得这个职位无关。
假设你的OS X内核中工作,你实际上可以做到这一点。
您可以使用的 OSMemberFunctionCast
宏一个成员函数指针转换为一个普通的C函数指针,做笔记,它应与第一个参数指向类,例如的一个实例被调用。
IOServiceMatchingCallback mycb = OSMemberFunctionCast(IOServiceMatchingCallback,
&myclassinstance, &MyClass::cb_method);
result = IOServiceAddMatchingNotification(
mNotifyPort,
kIOMatchedNotification,
IOServiceMatching( "IOFireWireLocalNode" ),
mycb,
&myclassinstance,
&enumerator);