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キットのドキュメント(DiscArbitation.frameworkがラッパーである)を調べるとkDADiskDescriptionMediaWholeKey、メディアが全体であるかどうか(つまり、ディスク全体またはその上のパーティションを表す)が説明されていることがわかります。パーティションではなく、ディスク全体を再イジェクトします。パーティションをアンマウントすることはできますが、イジェクトすることはできません。(それは意味がありません)

ディスクはマウント可能ですか?

のもう1つの条件DARequest.cは、ボリュームがマウント可能かどうかです。そのため、次のことを確認してください。

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

DADiskインスタンスの名前は有効ですか?

3番目のチェックでは、ボリュームの名前を検証します。一部のシステム提供の(内部)ボリュームには名前がなく、排出できません。チェックは非常に単純で、名前を探すだけなので、大したことではありません。

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

これらの3つのチェックを通過し、それらがあなたに当てはまるかどうかを確認してください。このようにして、何が問題なのかを突き止めることができます。

于 2013-01-03T17:51:52.863 に答える