| ログイン | ご入会 |
ADC連絡先
|
|
|
|
Q:現在、エクスポートコンポーネントに MovieExportFromProceduresToDataRef
関数を実装しようとしていますが、 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 の結果を無視しています。
さらに、コンポーネントマネージャ関数は、特定のタイプのデータ参照に対応したデータハンドラが複数ある場合には、最善の選択ができないことがよくあります。開発者は、データハンドラコンポーネントを探したり、開いたりする場合は必ず、GetDataHandler API または OpenADataHandler API のどちらかを使わなければなりません(上述の問題に注意)。FindNextComponent を使うと、望んでいないコンポーネントを取得してしまう可能性があります。 例えば、'alis' データハンドラを探しているときに、CDi ディスク用の Apple エイリアスデータハンドラ、単なる Apple エイリアスデータハンドラ、またはストリーミングファイルデータハンドラが見つかることがあります。これらのタイプ、およびサブタイプはすべて同じですが、それぞれ使用目的が異なります。 追加情報: QuickTime Data Handler Documentation [2002 年 2 月 7 日] |