IAppxFile
COM公式ドキュメント
パッケージ内のペイロードファイルまたはフットプリントファイルに関する情報を取得します。
メソッド 5
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
パッケージ内へのファイルの格納に使用される圧縮オプションを取得します。
| compressionOption | APPX_COMPRESSION_OPTION* | out | ファイルがパッケージ内にどのように格納されているかを示す圧縮オプションです。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
ファイルのコンテンツタイプを取得します。
| contentType | LPWSTR* | out | ファイルのコンテンツタイプです。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
contentType が使用するメモリの解放は呼び出し元の責任です。文字列のメモリを解放するには CoTaskMemFree 関数を使用してください。
例
例については、クイックスタート: アプリパッケージのコンテンツを抽出するを参照してください。
パッケージのルートディレクトリからの相対パスを含む、ファイルの名前を取得します。
| fileName | LPWSTR* | out | ファイルの名前と相対パスを格納する文字列です。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
fileName に返される文字列は、ブロックマップに記載されているファイル名と同一です。
fileName が使用するメモリの解放は呼び出し元の責任です。文字列のメモリを解放するには CoTaskMemFree 関数を使用してください。
例
例については、クイックスタート: アプリパッケージのコンテンツを抽出するを参照してください。
ファイルの非圧縮時のサイズを取得します。
| size | ULONGLONG* | out | 非圧縮時のサイズ (バイト単位) です。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
ファイルの非圧縮のコンテンツを含む読み取り専用のストリームを取得します。
| stream | IStream** | out | ファイルの非圧縮のコンテンツを含む読み取り専用のストリームです。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。
[Fatal] zip アーカイブ内のファイルのローカルファイルヘッダーまたはデータディスクリプターが無効な場合は、OPC エラーコード (0x8051xxxx) を返します。この失敗により OPC zip コンシューマー全体が無効な状態になり、このエラーの発生後は IAppxPackageReader オブジェクトから他のファイルにアクセスできなくなります。
ストリームが以前に読み取られており、その CRC が無効であった場合は HRESULT_FROM_WIN32(ERROR_CRC) (0x80070017) を返します。
返された IStream の Read メソッドおよび CopyTo メソッドの戻り値
[Fatal] ストリーム全体が読み取られ、その CRC が無効であると判明した場合は HRESULT_FROM_WIN32(ERROR_CRC) (0x80070017)
(zip ファイルの破損などにより) ファイルのコンテンツを展開できない場合は APPX_E_CORRUPT_CONTENT (0x80080206)
ファイル内のブロックを完全に読み取れない場合、またはブロックのサイズが想定外である場合は HRESULT_FROM_WIN32(ERROR_INVALID_DATA) (0x8007000d)
このファイルのブロックのコンテンツが、ブロックマップ内のハッシュと一致しない場合は APPX_E_BLOCK_HASH_INVALID (0x80080207)
解説(Remarks)
返される stream は読み取り専用で、複製可能です。
ペイロードファイルの検証は「遅延」実行されます。ファイルの GetStream メソッドを最初に呼び出したときに、対応する zip ファイル項目のローカルファイルヘッダーとデータディスクリプターが検証され、GetStream が失敗する場合があります。同じファイルに対する以降の GetStream の呼び出しでは、これらの検証は繰り返されません。zip ファイル項目の CRC チェックサムは、ストリームが順次すべて読み取られた場合にのみ検証されます。
ペイロードファイルに対して返される IStream のインスタンスは、シーケンシャルアクセス向けに最適化されています。ランダムアクセスもサポートされていますが、ランダムアクセスは低速で CPU 負荷が高くなる可能性があります。可能な限り、これらのストリームは 1 回のシーケンシャルな読み取りで処理することをお勧めします。同じ範囲を複数回読み取ることはサポートされていますが、パフォーマンスの観点からは推奨されません。利用シナリオ上必要な場合は、そのような範囲をキャッシュすることを検討してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IAppxFile "{91DF827B-94FD-468F-827B-57F41B2F6F2E}" #usecom global IAppxFile IID_IAppxFile "{}" #comfunc global IAppxFile_GetCompressionOption 3 var #comfunc global IAppxFile_GetContentType 4 var #comfunc global IAppxFile_GetName 5 var #comfunc global IAppxFile_GetSize 6 var #comfunc global IAppxFile_GetStream 7 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IAppxFile "{91DF827B-94FD-468F-827B-57F41B2F6F2E}" #usecom global IAppxFile IID_IAppxFile "{}" #comfunc global IAppxFile_GetCompressionOption 3 sptr #comfunc global IAppxFile_GetContentType 4 sptr #comfunc global IAppxFile_GetName 5 sptr #comfunc global IAppxFile_GetSize 6 sptr #comfunc global IAppxFile_GetStream 7 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。