質問

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

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

役に立ちましたか?

解決

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

  • DARegisterDiskAppearedCallback
  • DARegisterDiskDisappearedCallback
  • DARegisterDiskDescriptionChangedCallback

これらのカバーの挿入、取り外し(マウントできないボリュームも含む)
メタデータ変更イベント。

PS DASession をrunloop
に追加することを忘れないでください または、コールバックを取得しません。

他のヒント

  

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

このコードで3つのうち2つを取得できますが、3つ目のコードを作成するのにこれ以上の作業は必要ないと思います。

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);

などなど。

変更のために / Volumes を見て、必要なことをしますか?

Cocoaレベルで作業している場合は、 NSWorkspace

  • NSWorkspaceDidMountNotification
  • NSWorkspaceDidRenameVolumeNotification
  • NSWorkspaceWillUnmountNotification
  • NSWorkspaceDidUnmountNotification
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top