Jan*_*ler 8 cocoa objective-c diskarbitration
我正在尝试使用磁盘仲裁框架在我的Cocoa应用程序中卸载卷.
致电之前:
DADiskUnmount(disk,
kDADiskUnmountOptionDefault,
unmountCallback,
self );
Run Code Online (Sandbox Code Playgroud)
我注册了一个后来调用的回调函数:
void unmountCallback(DADiskRef disk, DADissenterRef dissenter, void *context )
{
if (dissenter != NULL)
{
DAReturn ret = DADissenterGetStatus(dissenter);
switch (ret) {
case kDAReturnBusy:
printf("kDAReturnBusy\n");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
在这个函数中,我尝试解释反对者返回值但是卡住了.我认为它应该是DAReturn类型并且具有类似kDAReturnBusy的值但是当例如iTunes正在使用该卷并且它无法卸载时"ret"具有值0xc010,我不太明白.
如果卸载失败,我想找出无法卸载卷的原因,以及其他应用程序使用它时提醒用户关闭此应用程序.
Pet*_*sey 17
但是,当iTunes使用该卷并且无法卸载时,"ret"的值为0xc010,我不太明白.
您链接到的DAReturn类型的文档列出了所有磁盘仲裁常量,如下所示:
Run Code Online (Sandbox Code Playgroud)kDAReturnError = err_local | err_local_diskarbitration | 0x01, /* ( 0xF8DA0001 ) */
因此,DA的错误返回全部由三个组件组成,一起进行OR运算.
如果您查看文档DADissenterGetStatus,它会说:
如果适用,BSD返回码使用unix_err()进行编码.
如果你然后搜索标题unix_err,你可以在/usr/include/mach/error.h中找到它,它说:
Run Code Online (Sandbox Code Playgroud)/* unix errors get lumped into one subsystem */ #define unix_err(errno) (err_kern|err_sub(3)|errno)
和:
Run Code Online (Sandbox Code Playgroud)/* * error number layout as follows: * * hi lo * | system(6) | subsystem(12) | code(14) | */
再次有这三个组成部分.error.h中的一些其他宏将系统和子系统值(例如,err_kern和err_sub(3))排列到这些位置.
现在,让我们打开计算器,按⌘3将其置于编程模式,将其切换到base-16,然后键入错误代码,看看它的内容:
0xC010
Run Code Online (Sandbox Code Playgroud)0000 0000 0000 0000 1100 0000 0001 0000 31 15 0
根据以上布局打破这一点,我们发现:
Run Code Online (Sandbox Code Playgroud)0000 00 31
系统:0,error.h表示err_kern.此错误来自内核.
Run Code Online (Sandbox Code Playgroud)00 0000 0000 11 31 15
子系统:3(0b11).加上系统代码与上述定义相匹配unix_err.所以这是一个BSD返回码,如上所述DADissenterGetStatus.
Run Code Online (Sandbox Code Playgroud)00 0000 0001 0000 31 15 0
个别错误代码:16(0x10,0b10000).
定义了UNIX/BSD错误<sys/errno.h>,其中说:
Run Code Online (Sandbox Code Playgroud)#define EBUSY 16 /* Device / Resource busy */
这告诉我你无法卸载该设备,因为它正在使用中.