IAppxFactory
COM公式ドキュメント
アプリパッケージの読み取りと書き込みを行うオブジェクトを作成します。(IAppxFactory)
解説(Remarks)
IAppxFactory インターフェースは、アプリパッケージのリーダーおよびライターを作成するファクトリーメソッドに加え、パッケージ外部にあるブロックマップやマニフェストのリーダーを作成するメソッドを提供します。
例
例については、次を参照してください。
メソッド 5
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ファイルを追加できる書き込み専用のパッケージオブジェクトを作成します。
| outputStream | IStream* | in | シリアル化されたパッケージデータを受け取る出力ストリームです。このストリームは少なくとも Write メソッドをサポートしている必要があります。 |
| settings | APPX_PACKAGE_SETTINGS* | in | このパッケージの生成に使用する設定です。 |
| packageWriter | IAppxPackageWriter** | out | このメソッドによって作成されたパッケージライターです。 |
戻り値
型: HRESULT
メソッドが成功した場合は S_OK を返します。それ以外の場合は、次の表に示すものを含む(ただしこれらに限定されない)エラーコードを返します。
| 戻り値 | 説明 |
|---|---|
| APPX_PACKAGE_SETTINGS 構造体の hashMethod メンバーに指定された値が、有効なハッシュアルゴリズムの URI ではありません。 | |
| APPX_PACKAGE_SETTINGS 構造体の hashMethod メンバーに指定された値が、有効なハッシュアルゴリズムの URI ではありません。 | |
| ハッシュ値が SHA1 です。 |
解説(Remarks)
IAppxPackageWriter の実装が、ライターオブジェクトに対して Close メソッドが呼び出される前に出力ストリームへデータを書き込むことは保証されません。ライターが Close メソッドから戻るまで、他のスレッドが outputStream にアクセスしてはなりません。
例
例については、アプリパッケージを作成する方法を参照してください。
IStream から提供されるコンテンツを基に、読み取り専用のパッケージリーダーを作成します。このメソッドはデジタル署名の検証を行いません。
| inputStream | IStream* | in | 読み取り対象となるパッケージのコンテンツを提供する入力ストリームです。このストリームは Read、Seek、Stat をサポートしている必要があります。これらのメソッドが失敗した場合、そのエラーコードがこのメソッドに渡され、そのまま返されることがあります。 |
| packageReader | IAppxPackageReader** | out | パッケージリーダーです。 |
戻り値
型: HRESULT
メソッドが成功した場合は S_OK を返します。それ以外の場合は、次の表に示すものを含む(ただしこれらに限定されない)エラーコードを返します。
| 戻り値 | 説明 |
|---|---|
| inputStream から提供される ZIP ファイルが、インターリーブされた OPC パッケージです。 | |
| inputStream から提供される OPC パッケージに、OPC のパッケージ/パートのリレーションシップが含まれています。 | |
| inputStream から提供される OPC パッケージにマニフェストまたはブロックマップがないか、CI カタログが存在するにもかかわらず署名ファイルがありません。 | |
| パッケージマニフェストが有効ではありません。 | |
| パッケージのブロックマップが有効でないか、ZIP セントラルディレクトリ内のファイルの一覧がブロックマップ内のファイルの一覧と一致しないか、ZIP セントラルディレクトリに記載されたファイルのサイズがブロックマップに記載されたファイルサイズおよびブロックサイズと一致しません。 |
解説(Remarks)
CreatePackageReader メソッドは、ストリームを通じてアプリパッケージのフットプリント要素を直ちに取得し、その内容を検証します。このメソッドは、OPC パッケージとすべてのフットプリント要素(ZIP セントラルディレクトリ、マニフェスト、[Content_Types].xml、ブロックマップを含む)が有効である場合にのみ成功します。
例
例については、クイックスタート: アプリパッケージの内容を抽出するおよびクイックスタート: アプリパッケージのマニフェスト情報を読み取るを参照してください。
IStream から提供されるコンテンツを基に、読み取り専用のマニフェストオブジェクトモデルを作成します。
| inputStream | IStream* | in | 読み取り対象となるマニフェスト XML を提供する入力ストリームです。このストリームは Read、Seek、Stat をサポートしている必要があります。これらのメソッドが失敗した場合、そのエラーコードがこのメソッドに渡され、そのまま返されることがあります。 |
| manifestReader | IAppxManifestReader** | out | マニフェストリーダーです。 |
戻り値
型: HRESULT
メソッドが成功した場合は S_OK を返します。それ以外の場合は、次の表に示すものを含む(ただしこれらに限定されない)エラーコードを返します。
| 戻り値 | 説明 |
|---|---|
| inputStream に、マニフェストとして構文的に有効な XML が含まれていません。 |
解説(Remarks)
アプリパッケージの外部にあるマニフェストを読み取るには、CreateManifestReader を使用します。このメソッドはマニフェスト XML を検証します。manifestReader は、マニフェスト XML 内のすべてのデータ要素と属性へのアクセスを提供します。マニフェストの検証エラーの発生位置は、AppxPackaging の ETW イベントログに記録されます。
例
例については、クイックスタート: アプリパッケージのマニフェスト情報を読み取るを参照してください。
IStream から提供されるコンテンツを基に、読み取り専用のブロックマップオブジェクトモデルを作成します。
| inputStream | IStream* | in | 読み取り対象となるブロックマップ XML を提供するストリームです。このストリームは Read、Seek、Stat をサポートしている必要があります。これらのメソッドが失敗した場合、そのエラーコードがこのメソッドに渡され、そのまま返されることがあります。 |
| blockMapReader | IAppxBlockMapReader** | out | ブロックマップリーダーです。 |
戻り値
型: HRESULT
メソッドが成功した場合は S_OK を返します。それ以外の場合は、次の表に示すものを含む(ただしこれらに限定されない)エラーコードを返します。
| 戻り値 | 説明 |
|---|---|
| inputStream に、ブロックマップとして構文的に有効な XML が含まれていません。 |
解説(Remarks)
アプリパッケージの外部にあるブロックマップを読み取るには、CreateBlockMapReader メソッドを使用します。blockMapReader は、ブロックマップ XML 内のすべてのデータ要素と属性へのアクセスを提供します。
IStream から提供されるコンテンツとデジタル署名を基に、読み取り専用のブロックマップオブジェクトモデルを作成します。
| blockMapStream | IStream* | in | 読み取り対象となるブロックマップ XML を提供するストリームです。このストリームは Read、Seek、Stat をサポートしている必要があります。 |
| signatureFileName | LPWSTR | in | 入力ストリームの内容を検証するために使用するデジタル署名が格納されたファイルです。 |
| blockMapReader | IAppxBlockMapReader** | out | ブロックマップリーダーです。 |
戻り値
型: HRESULT
メソッドが成功した場合は S_OK を返します。それ以外の場合は、以下に示すものを含む(ただしこれらに限定されない)エラーコードを返します。このメソッドは、内部で使用される検証 API から渡されるエラーを返すことがあります。 たとえば、署名を読み取れない場合、署名が無効な場合、または署名が blockMapStream の内容と一致しない場合、Crypto および WinTrust のエラーコード (0x8009xxxx、0x800bxxxx) を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| blockMapStream に、ブロックマップとして構文的に有効な XML が含まれていません。 |
解説(Remarks)
このメソッドは、ブロックマップがアプリパッケージの外部に単独で存在する場合に使用します。ブロックマップオブジェクトは、ブロックマップ XML 内のすべてのデータ要素と属性へのアクセスを提供します。
fileName パラメーターには、ディスク上にあるパッケージのデジタル署名ファイル (.p7x) のパスを含めて指定します。このパラメーターが NULL でない場合、このメソッドは署名ファイルの形式を検証し、その署名に対して blockMapStream の内容を検証します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IAppxFactory "{BEB94909-E451-438B-B5A7-D79E767B75D8}" #usecom global IAppxFactory IID_IAppxFactory "{5842A140-FF9F-4166-8F5C-62F5B7B0C781}" #comfunc global IAppxFactory_CreatePackageWriter 3 sptr,var,sptr #comfunc global IAppxFactory_CreatePackageReader 4 sptr,sptr #comfunc global IAppxFactory_CreateManifestReader 5 sptr,sptr #comfunc global IAppxFactory_CreateBlockMapReader 6 sptr,sptr #comfunc global IAppxFactory_CreateValidatedBlockMapReader 7 sptr,wstr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IAppxFactory "{BEB94909-E451-438B-B5A7-D79E767B75D8}" #usecom global IAppxFactory IID_IAppxFactory "{5842A140-FF9F-4166-8F5C-62F5B7B0C781}" #comfunc global IAppxFactory_CreatePackageWriter 3 sptr,sptr,sptr #comfunc global IAppxFactory_CreatePackageReader 4 sptr,sptr #comfunc global IAppxFactory_CreateManifestReader 5 sptr,sptr #comfunc global IAppxFactory_CreateBlockMapReader 6 sptr,sptr #comfunc global IAppxFactory_CreateValidatedBlockMapReader 7 sptr,wstr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。