2011-12-19 6 views
7

私は、ディスクアービトレーションフレームワークを使って自分のCocoaアプリケーションでボリュームをアンマウントしようとしています。OS Xでボリュームをアンマウントしようとすると、戻り値を解釈しない

DADiskUnmount(disk, 
       kDADiskUnmountOptionDefault, 
       unmountCallback, 
       self); 

私はのは、その後に呼び出されるコールバック関数の登録:私は反対者の戻り値を解釈しますが立ち往生してみてください。この機能で

void unmountCallback(DADiskRef disk, DADissenterRef dissenter, void *context) 
{ 
    if (dissenter != NULL) 
    { 
     DAReturn ret = DADissenterGetStatus(dissenter); 

     switch (ret) { 
     case kDAReturnBusy: 
      printf("kDAReturnBusy\n"); 
      break; 
    } 
} 

を呼び出す前に

。私はそれがDAReturn型でなければならないと思って、kDAReturnBusyのような値を持っています。 iTunesがそのボリュームを使用していて、アンマウントできません。「ret」の値が0xc010で、わかりません。

アンマウントが失敗した場合は、ボリュームをアンマウントできない理由と、別のアプリケーションを使用している場合に、このアプリケーションを終了するようユーザーに思い出させる理由を知りたい場合があります。

答えて

16

iTunesがそのボリュームを使用していて、アンマウントできません。「ret」の値が0xc010で、わかりません。

あなたがにリンクされているドキュメントは、DAReturnタイプのために、このように見えるように、すべてのディスク仲裁定数を示しています。だから、

kDAReturnError = err_local | err_local_diskarbitration | 0x01, /* (0xF8DA0001) */ 

、DAのエラーリターンは、すべての3つのコンポーネントで構成されています一緒にORします

あなたはthe documentation for DADissenterGetStatusを見れば、それは言う:

BSDのリターンコード、該当する場合、)(unix_errでエンコードされます。

/* unix errors get lumped into one subsystem */ 
#define unix_err(errno)  (err_kern|err_sub(3)|errno) 

と::

をあなたが unix_errのヘッダを検索する場合

、あなたが言うこれ、/usr/include/mach/error.hでそれを見つけます

/* 
* error number layout as follows: 
* 
* hi      lo 
* | system(6) | subsystem(12) | code(14) | 
*/ 

3つのcom再びポーネンズ。 error.h内のいくつかの他のマクロは、システムとサブシステムの値(例えば、err_kernerr_sub(3))をそれらの位置に配置します。

だから今、のは、電卓を開いてみましょう、プレス⌘3、プログラマ・モードに入れBASE-16をして、それを切り替え、自分のエラーコードを入力し、それが言うことを確認する:

0xC010

0000 0000 0000 0000 1100 0000 0001 0000 
31     15    0 

それを離れて壊す上記のレイアウトに応じて、我々は見つける:

0000 00 
31  

システム:0、error.hはerr_kernです。このエラーはカーネルからのものです。

 00 0000 0000 11 
31     15 

サブシステム:3(0b11に)。これに加えて、システムコードは前述のunix_errの定義に一致します。したがって、これはBSDのリターンコードで、DADissenterGetStatusと言われています。

     00 0000 0001 0000 
31     15    0 

個々のエラーコード:16(0x10を、0b10000)。

UNIX/BSDのエラーが言うこれ、<sys/errno.h>で定義されています。

#define EBUSY  16  /* Device/Resource busy */ 

これは、それが使用中だから、あなたがそのデバイスをアンマウントすることができないことを私に示唆しています。

+1

(あなたにすべての新しいシステムの男はいくつかの点で表示されるはず思いやりのウォークスルーのための余分なポイントを与えたいと思います。) –

+1

質問に報奨金を提供すること自由に感じ@quixoto、その後、ピーターにそれを授与:) –

+0

はあなたに感謝しますあなたの包括的な答えのために、非常に多くのピーターです。これはまさに私が探していた情報です! – JLinX

関連する問題