3

現在、10.6.7 で、新しい USB デバイスが接続されたときに通知を受け取るアプリケーションを開発しています。「IOServiceAddMatchingNotification」などを処理する IOKit 関数があることがわかりました。この特定の関数からの戻り値は 0 であるため、問題はおそらく、この関数に渡される一致する Dictionary にあると思います。私は辞書をそのように宣言します:

CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName);

デバイスごとに通知を受け取りたくないので、これがこの特定の辞書を作成する正しい方法かどうかわかりません。

私の完全なコードは次のようになります。

ioKitNotificationPort = IONotificationPortCreate(kIOMasterPortDefault);
notificationRunLoopSource = IONotificationPortGetRunLoopSource(ioKitNotificationPort);

CFRunLoopAddSource(CFRunLoopGetCurrent(), notificationRunLoopSource, kCFRunLoopDefaultMode);

CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName);


addMatchingNotificationResult = IOServiceAddMatchingNotification(ioKitNotificationPort,
                                                                 kIOPublishNotification,
                                                                 matchingDict,
                                                                 deviceAdded,
                                                                 NULL,

なぜこれがうまくいかないのか、誰にも分かりますか?(注: Callback 関数は static void c 関数であり、残りは Obj-C クラスにラップされています)。

ありがとう

Xcode 4、10.6.7

4

4 に答える 4

4

奇妙なことに、通知が準備される前に、IOServiceAddMatchingNotification によって返された反復子を空にする必要があります。提供されたコードにはそれが表示されないため、問題になる可能性があります。そのイテレータは、通知を実行し続けるために実際に保持する必要があるものです。

io_iterator_t ioNotification;

addMatchingNotificationResult = IOServiceAddMatchingNotification(ioKitNotificationPort,
                                                                 kIOPublishNotification,
                                                                 matchingDict,
                                                                 deviceAdded,
                                                                 NULL,
                                                                 &ioNotification);

while ((service = IOIteratorNext(ioNotification)))
{
    NSLog(@"Hey, I found a service!");

    IOObjectRelease(service); // yes, you have to release this
}
于 2011-08-09T00:48:48.210 に答える
1

私の意見では、opensource.apple.com で IOUSBFamily からソース コード フォームをダウンロードし、USB Prober のコードを見つける必要があります。このアプリケーションは、説明したのとまったく同じことを行い、USB デバイスの接続をリッスンします。(さらに、USB Proberまた、一般的なデバイスと構成記述子も取得します。おそらく、それも必要なものです。)

于 2011-07-13T14:48:33.173 に答える
1

探したいデバイスの VID と PID を一致辞書に追加しましたか? あなたが持っている辞書、および VID= yourVid、PID= yourPid の場合、次のようになります。

CFDictionaryAddValue(matchingDict, usbVendorId, yourVid);  
CFDictionaryAddValue(matchingDict, usbProductId, yourPid);  

もう 1 つ - IOServiceAddMatchingNotification の呼び出しが成功した後、呼び出しで設定された反復子を使用して、デバイスに追加されたハンドラーを呼び出す必要があります。これにより、通知が有効になり、既存のデバイスがチェックされます。

于 2012-07-18T16:50:41.187 に答える
0

あなたが説明していると思うことを行う最も簡単な方法は、DiskArbitration Framework にフックすることです。DA は OSX では比較的新しく、ユーザーランド アプリケーションが接続されたデバイスを検査できるようにします。これは、iPod が接続されているときに iTunes を開いたり、カメラが接続されているときに iPhoto を起動したりするために使用されるものです。探している USB デバイスがストレージ デバイスの場合は、これで十分です。それ以外の場合は、一致する辞書ルートに移動する必要があります...

于 2011-07-07T11:59:00.410 に答える