3

在以下回调函数中卸载后,我尝试弹出外部 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。我真的不知道出了什么问题。任何人都可以对此发表评论吗?这是否意味着无法弹出磁盘映像???提前谢谢了!!

4

1 回答 1

3

文档对此非常不清楚。因此,最好查看DARequest 类的实际源代码以找出导致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;
}

通过这三项检查,看看它们是否适用于您。这样你一定会找出问题所在。

于 2013-01-03T17:51:52.863 回答