objective-c - DADiskEject 导致问题,错误代码为 12 (kDAReturnUnsupported)

标签 objective-c cocoa diskarbitration

我尝试在以下回调函数中卸载后弹出外部 USB 驱动器和磁盘镜像:

void __unmountCallback(DADiskRef disk, DADissenterRef dissenter, void *context )
{
    ...
    if (!dissenter) 
    {
        DADiskEject(disk, 
                    kDADiskEjectOptionDefault, 
                    __ejectCallback, 
                    NULL);
    }
}

不幸的是,我在 __ejectCallback 中遇到错误...

void __ejectCallback(DADiskRef disk, DADissenterRef dissenter, void * context)
{
    if(dissenter) 
    {
       DAReturn status = DADissenterGetStatus(dissenter);
       if(unix_err(status)) 
       {
        int code = err_get_code(status);
            ...
       }
    }
}

错误代码为 12,表示 kDAReturnUnsupported。我真的不知道出了什么问题。有人可以对此发表评论吗?这是否意味着无法弹出磁盘镜像??? 提前谢谢了!!

最佳答案

文档对此非常不清楚。因此,查看实际的 source code of the DARequest class 是个好主意。找出导致 kDAReturnUnsupported 响应的原因。

它揭示了返回 kDAReturnUnsupported 响应的以下条件:

您的 DADisk 实例是否代表整个卷?

if ( DADiskGetDescription(disk, kDADiskDescriptionMediaWholeKey) == NULL )
{
    status = kDAReturnUnsupported;
}

if ( DADiskGetDescription(disk, kDADiskDescriptionMediaWholeKey) == kCFBooleanFalse )
{
     status = kDAReturnUnsupported;
}

查看 IO Kit 文档(DiscArbitation.framework 是其包装器),我们发现 kDADiskDescriptionMediaWholeKey 描述了媒体是否完整(即,它代表整个磁盘或上的一个分区),因此请检查您弹出的是整个光盘而不是一个分区。请记住,您可以卸载分区,但不能弹出它。 (这没有意义)

光盘可以挂载吗?

DARequest.c 中的另一个条件是该卷是否可挂载,因此请确保它是:

if (DADiskGetDescription(disk, kDADiskDescriptionVolumeMountableKey) == kCFBooleanFalse )
{
     status = kDAReturnUnsupported;
}

DADisk 实例的名称是否有效?

第三次检查验证卷的名称。某些系统提供的(内部)卷没有名称,无法弹出。检查非常简单,只需查找任何 名称,所以这应该没什么大不了的。

if (DARequestGetArgument2(request) == NULL)
{
    status = kDAReturnUnsupported;
}

检查这三项检查,看看它们是否适用于您。这样您一定会发现问题所在。

关于objective-c - DADiskEject 导致问题,错误代码为 12 (kDAReturnUnsupported),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10606817/

相关文章:

objective-c - 使用 Cocoa App 中嵌入的 AppleScript-ObjC 处理错误的最佳方法?

ios - 如何删除特定的 UICollectionViewCell 图像。按下特定图像上的按钮时

ios - 在 Cocoa KVO 中,为什么 NSMutableArray 代理的变化不通知观察者?

macos - 以编程方式安装 DVD 的 OSX 不会启动用户指定的应用程序

ios - 如何关闭当前 View Controller ,就像按下导航 Controller 上的后退按钮一样

ios - ShinobiCharts - donut 系列绘图区

cocoa - 编写 Firefox 和 Skype for Mac 时使用了 "Interface Builder"

objective-c - 如何在 AppleScript-Cocoa 应用程序中使用 Objective C?

swift - 将 DAAppearanceTime 转换为日期

cocoa - 检测可移动存储何时卸载