1

ユーザーがUSBキーを挿入し、外部ディスクを追加し、ディスクイメージをマウントするときに、ストレージデバイスのリストを更新したいと思います。IOKitのIOServiceAddInterestNotificationは進むべき道のように見えますが、kIOMediaClassに一般的な関心を登録するという明白な使用法は、ボリュームのアンマウントの通知のみを提供し、その後はたまにしか提供しません。

これを行う正しい方法は何ですか?

4

4 に答える 4

3

DiskArbitration.h の次の呼び出しは、まさに私が望むことを行います。

  • DARegisterDiskAppearedCallback
  • DARegisterDiskDisappearedCallback
  • DARegisterDiskDescriptionChangedCallback

これらは、挿入、削除 (マウントできないボリュームであっても) の
メタデータ変更イベントをカバーします。

DASessionPSを実行ループに追加することを忘れないでください。そうし
ないと、コールバックが得られません。

于 2008-10-11T21:35:33.343 に答える
1

ユーザーが USB キーを挿入し、外部ディスクを追加し、ディスク イメージをマウントするときに、ストレージ デバイスのリストを更新したいと考えています。

このコードで 3 分の 2 を得ることができます。

File:               USBNotificationExample.c

Description:        This sample demonstrates how to use IOKitLib and IOUSBLib to set up asynchronous
                    callbacks when a USB device is attached to or removed from the system.
                    It also shows how to associate arbitrary data with each device instance.

http://opensource.apple.com/source/IOUSBFamily/IOUSBFamily-385.4.1/Examples/Another%20USB%20Notification%20Example/USBNotificationExample.c

USB HDDの接続を監視するために、私は個人的に(このコードのわずかに変更されたコピー)を長い間使用してきました。

この小さなサンプルからわかるように、マウントされたドライブの監視に適応できることが容易に証明される可能性があります。またはそうではないかもしれません。YMMV。

    matchingDict = IOServiceMatching(kIOUSBDeviceClassName);        // Interested in instances of class
                                                                    // IOUSBDevice and its subclasses

そしてそれが一致したとき

void DeviceAdded(void *refCon, io_iterator_t iterator)
{
    kern_return_t           kr;
    io_service_t            usbDevice;
    IOCFPlugInInterface     **plugInInterface=NULL;
    SInt32                  score;
    HRESULT                 res;    

    while ( (usbDevice = IOIteratorNext(iterator)) )
    {
        io_name_t                   deviceName;
        CFStringRef                 deviceNameAsCFString;
        MyPrivateData               *privateDataRef = NULL;
        UInt32                      locationID;

        printf("Device 0x%08x added.\n", usbDevice);

などなど。

于 2012-01-09T14:57:50.220 に答える
0

変更を監視/Volumesすると、必要なことが行われますか?

于 2008-10-05T13:32:14.287 に答える
0

Cocoa レベルで作業している場合は、登録してNSWorkspaceから次の通知を受け取ることもできます。

  • NSWorkspaceDidMountNotification
  • NSWorkspaceDidRenameVolumeNotification
  • NSWorkspaceWillUnmountNotification
  • NSWorkspaceDidUnmountNotification
于 2011-12-30T14:36:43.360 に答える