高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1116
couldNotResolveDataRef (-2000) returned from DataHSetDataRef and OpenADataHandler


Q:現在、エクスポートコンポーネントに MovieExportFromProceduresToDataRef 関数を実装しようとしていますが、DataHSetDataRef API または OpenADataHandler API を使うと couldNotResolveDataRef エラーに遭遇します。

DataHSetDataRef の場合では、渡された dataRefType (現在 'alis' の参照だけを対象にしています)のためのハンドラが見つかるまで、反復処理ですべてのデータハンドラコンポーネントを対象に FindNextComponent を手作業で実行しています。OpenComponent を使ってコンポーネントを開き、DataHSetDataRef を呼び出すと couldNotResolveDataRef (-2000) エラーになります。

QuickTime に関するある文献を調べたところ、OpenADataHandler があることがわかりました。この関数は、私がやりたかったことができる、はるかに優れた便利な方法のように思えました。この API を使うために、前に書いたコードをすべて削除しましたが、同じ couldNotResolveDataRef エラーが返されます。

DataHSetDataRef を機能させるために何かほかにできることはありますか? OpenADataHandler は正しい API なのでしょうか?

A:DataHSetDataRef は、現在扱っているデータハンドラのコンポーネントにデータ参照を割り当てます。この参照は、ムービーのコンテナを識別しその場所を見つけるために使います。

DataHSetDataRef の 'alis' データハンドラコンポーネントの内部実装は、MatchAlias を実行して、参照先のファイルを探します。MatchAlias は、ファイルがない場合には、ファイルが見つからなかったことを示すエラー(fnfErr)を返しますが、有効な FSSpec も返します。

このときに DataHSetDataRef から返されるのは、couldNotResolveDataRef というエラーで、まさしく遭遇しているエラーです。呼び出しはエラーを返しますが、データ参照に問題はありません。

一方、OpenADataHandler は、1 回の呼び出しで、データハンドラのコンポーネントを見つけて、それを開き、設定する簡易関数です。その内部実装では、GetDataHandler、OpenAComponent、および SetDataRef を順に呼び出します。ただし、DataHSetDataRef の結果を調べ、結果が noErr でない場合には、ここでも couldNotResolveDataRef を返します。

したがって、現時点では、GetDataHandler、 OpenAComponent、および SetDataRef の呼び出しの並び(リスト 1 参照)を、より単純な OpenADataHandler の呼び出しに置き換えることはできません。ファイルが既に存在すれば、この問題に遭遇することはありません。

ファイルが存在しない可能性もあるので、コードでは DataHSetDataRef の結果を無視しています。

Component   dh;
DataHandler theDataHandler;

dh = GetDataHandler((Handle)inAlias, inDataRefType, kDataHCanRead | kDataHCanWrite);
if (NULL == dh) {
    err = cantFindHandler;
    goto bail;
}

err = OpenAComponent(dh, &theDataHandler);
if (err) goto bail;

// ファイルが存在しない可能性もあるので、この呼び出しのエラーは無視する
DataHSetDataRef(theDataHandler, (Handle)inAlias);

リスト 1 データハンドラを探して開く

さらに、コンポーネントマネージャ関数は、特定のタイプのデータ参照に対応したデータハンドラが複数ある場合には、最善の選択ができないことがよくあります。開発者は、データハンドラコンポーネントを探したり、開いたりする場合は必ず、GetDataHandler API または OpenADataHandler API のどちらかを使わなければなりません(上述の問題に注意)。FindNextComponent を使うと、望んでいないコンポーネントを取得してしまう可能性があります。

例えば、'alis' データハンドラを探しているときに、CDi ディスク用の Apple エイリアスデータハンドラ、単なる Apple エイリアスデータハンドラ、またはストリーミングファイルデータハンドラが見つかることがあります。これらのタイプ、およびサブタイプはすべて同じですが、それぞれ使用目的が異なります。

追加情報:

QuickTime Data Handler Documentation

Using Data Handler Components

GetDataHandler Reference

OpenADataHandler Reference


[2002 年 2 月 7 日]