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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top