WM_DEVICECHANGE на OS X
Продолжение к WM_DEVICECHANGE и все все все (потому и заголовок такой), только на маке.
На OS X, казалось бы, все хорошо, там есть такое:
DARegisterDiskAppearedCallback(m_session, kDADiskDescriptionMatchVolumeMountable, mountCallback2, this);
Ну и дальше в том же духе. И на всовывание USB-карточки прилетает callback.
Дальше мы хотим узнать, что же нам всунули, идем получать список маунтов:
CFURLEnumeratorRef enumerator = CFURLEnumeratorCreateForMountedVolumes(NULL, kCFURLEnumeratorSkipInvisibles, NULL);
Фигак, а нашего тома в этом списке еще нет.
Причем, понятно, если мы в отладчике все проходим, пошагово, то все есть. А если вживую - то нет. Только отладочная печать, только хардкор.
Решение понятное: опять поллинг. Но можно не по таймеру, а "до успеха" (или пока к этому же разделу не прилетел unmount callback, что влегкую может быть если контакт у USB хреновый).
Чума, короче, на оба дома.
Comments
А в
А в DARegisterDiskDescriptionChangedCallback, случайно, не прилетает что надо?
В смысле - туда прилетит уже
В смысле - туда прилетит уже после того, как оно в volume list появится "по всей системе"?
Интересная мысль, но у меня уже с поллингом все хорошо. То есть я хватаю оба коллбека, DiskAppeared и DescriptionChanged, а дальше делаю три запроса к списку томов и к их типу. Если список/тип меняются, значит что-то обновилось.
Работает.