Open Packaging Conventions ファイル用の Win32 API更新日: 2009 年 4 月 28 日 ダウンロードPDC08_Packaging_JPN.docx (Word 形式、926 KB) 目次:
Jack Davis 対象:Windows® 7 要約:このドキュメントでは、Office Open XML ファイル形式 (ECMA-376 標準) に準拠するカスタム コンテナー ファイルの Open Packaging Conventions (OPC) API の Win32 実装の概要について説明します。また、OPC の主要概念の紹介、この概念の Win32 実装へのマッピングに関する説明を行い、2 つの付録では、Win32 と OPC API のマネージ実装の対応とパッケージに関連した URI の文字列表記について説明します。 法的通知:このドキュメントは暫定版であり、このソフトウェアの最終的な製品版の発売時に実質的に変更されることがあります。 1. はじめにOpen Packaging Conventions (OPC) は、コンテナー ファイル テクノロジの仕様です。これは、Office Open XML の ISO/IEC 標準と ECMA 標準のファイル形式の基盤となっています。OPC 仕様では、ファイル形式の設計担当者に対して、アプリケーション ファイルやリソースを格納するための、アクセスが容易で、柔軟性のある、カスタムの圧縮ファイルの形式を作成するためのガイドラインを提供しています。OPC ベースのカスタムの形式を使用しているファイルを "パッケージ" と呼びます。 OPC は、業界標準のコンテナー ファイル テクノロジで、これを使用すると、アプリケーションではデータや関連リソースを、移植可能でアクセスしやすい 1 つのファイルに格納することができます。また、主要な物理フォーマットとしては、標準的な ZIP ファイルが使用されます。この新しいファイル パッケージ化テクノロジは、いくつかの主要なマイクロソフト アプリケーションで既に採用されています。
複数のデータ ファイルを 1 つの ZIP ファイルに格納するという馴染みのある使用方法に加えて、Open Packaging Conventions では、新しいファイルの種類を実装するための、オープンで拡張可能なフレームワークを構築するいくつかの革新的な機能が追加されました。OPC のテクノロジは、Office Open XML 標準 (ISO/IEC-29500 および ECMA-376 の Part 2) で定義されています。 このドキュメントでは、Packaging API について説明します。これは、OPC API の Win32 実装で、これを使用すると、プログラムでパッケージの読み込み、書き込み、および変更を行うことができます。
a. OPC パッケージの概念パッケージとは、アプリケーション データを含む圧縮ファイルのことです。OPC 仕様では、パッケージを定義するために、"パーツ" と "リレーションシップ" という 2 つの基本的な概念が導入されました。パーツとは、アプリケーション データを含む物理オブジェクトで、パッケージ内に存在します。リレーションシップとは、パッケージやパーツと、URI アドレスを指定できるリソース (パーツや外部の Web サイトなど) の間の、論理的な関連付けです。図 1 は、パッケージのパーツとリレーションシップの概念的な違いを示しています。 図 1: パッケージのパーツとリレーションシップの役割 パーツ物理パッケージにおいて、パーツはファイル システムのファイルに似ています。パーツは、ファイル システムのフォルダー構成と同じように、階層構造になっています。図 2 では、単純なパッケージを使用して、この構成上の共通点を示しています。 パーツとファイルには共通点がありますが、パーツはファイルとは区別されます。パーツは、OPC 仕様で規定されているプロパティを使用する、バイトのストリームとして定義されます。図 2 に示すように、Name プロパティの値 (パーツ名) は、パッケージ ルートからのパーツの URI です (Name プロパティおよびパーツのその他のプロパティの詳細については、OPC 仕様を参照してください)。 図 2: 単純なパッケージの階層構成 (パーツ名は引用符内に記載) 図 2 に示すように、パーツ名は文字列として表すことができます。この文字列はファイルの完全なパスと似ており、ファイル システムでファイルの名前とパスを指定する際と同様の規則の多くに従います。パーツ名の詳細については、OPC 仕様を参照してください。パッケージ内の階層構造と URI ベースのパーツの名前付けによって、OPC 仕様に基づいてカスタム ファイル形式を作成するパッケージの設計担当者は、各自の形式およびアプリケーションのニーズに最適なパッケージ オブジェクトの論理グループを自由に選択できます。 リレーションシップリレーションシップは、リソースの "ソース" と "ターゲット" 間の、方向の関連付けを定義します。リレーションシップのソースは、パーツまたはパッケージです。リレーションシップのターゲットには、パッケージの内側または外側にある、URI アドレスを指定できる任意のリソースを指定できます。パッケージとパーツはどちらも URI アドレスを指定できるので、両方ともリレーションシップのターゲットに指定できます。たとえば、図 3 は、ソースが "\text\swings" パーツで、ターゲットが "\images\tire_swing.jpg" パーツというリレーションシップを概念的に表したものです。 図 3: 2 つのパーツを関連付けているリレーションシップを概念的に表したす単純なパッケージ リレーションシップでによって定義される関連付けは、"リレーションシップ マークアップ" と呼ばれる XML マークアップを使用して表されます。リレーションシップ マークアップは、Relationships パーツと呼ばれる特殊なパーツのパーツ コンテンツとして格納されます。リレーションシップのソースとなっている各パッケージまたはパーツは、各自のリレーションシップ マークアップをそれぞれの Relationships パーツに格納します。リレーションシップ マークアップに関する詳細については、OPC 仕様を参照してください。 たとえば、図 3 のリレーションシップがパッケージに追加された場合、パッケージの階層には、図 4 のように Relationships パーツが追加されます。 図 4: Relationships パーツを含む単純なパッケージの階層 図 4 の Relationships パーツを含む単純なパッケージの階層 の Relationships パーツのパーツ コンテンツ (リレーションシップ マークアップ) を図 5 に示します。 図 5: 単純なパッケージの階層の Relationships パーツの詳細 Relationships パーツの名前は、格納するリレーションシップのソースの URI から派生します。Relationships パーツのパーツ名の詳細については、「付録 B: リレーションシップ パーツの名前付け」を参照してください。 Relationships パーツでは、リレーションシップで定義される関連付けをソースのコンテンツから分離することで、関連付けを簡単に見つけられるようにして、ソースのコンテンツが変更されるのを防いでいます。 リレーションシップと Relationships パーツの詳細については、OPC 仕様を参照してください。 デジタル署名デジタル署名は、パッケージの作成者を特定し、署名済みの "パッケージ コンポーネント"(パーツ、リレーションシップなど) が、署名後に変更されていないことを確認するために使用できます。 OPC 仕様では、パッケージのデジタル署名の要件が詳しく規定されていますが、このホワイト ペーパーではこのトピックについては説明しません。パッケージへのデジタル署名の Packaging API の実装に関する説明は、Windows SDK に含まれています。この説明は、[Packaging](パッケージ化)、[Packaging Programming Guide](パッケージ化プログラミング ガイド)、[Packaging Programming Overview](パッケージ化プログラミングの概要)、[Packaging Advanced Programming Tasks](パッケージ化プログラミングの高度なタスク) と移動することで参照できます。 ページのトップへ 2. Packaging API オブジェクト モデルOPC の主要概念は、"図 6: Packaging API オブジェクト モデル (OPC の主要概念を表しているインターフェイスでは概念がかっこ書きで記載され、その他のインターフェイスは API 固有)" および次の表に示している、Packaging パッケージ化 API の Win32 COM インターフェイスによって表されます。
図 6: Packaging API オブジェクト モデル (OPC の主要概念を表しているインターフェイスでは概念がかっこ書きで記載され、その他のインターフェイスは API 固有と記載) Packaging API の IOpcFactory インターフェイスでは、この主要概念およびデジタル署名の機能を表すインターフェイスにアクセスできます。IOpcFactory インターフェイスは、CoCreateInstance を呼び出して作成できます。 図 7: 階層および Packaging API オブジェクト モデルによって表される単純なパッケージ 既に説明したように、図 7 の単純なパッケージには、ソースが "\text\swings" パーツで、ターゲットが "\images\tire_swing.jpg" パーツである 1 つのリレーションシップがあります。そのため、オブジェクト モデルにも 1 つのリレーションシップのみが存在しています。 これ以降のトピックでは、OPC の主要概念の Packaging API インターフェイス実装について紹介し、デジタル署名にアクセスする方法について説明します。 Packaging API の Set インターフェイスは、順序のないコレクションです。そのため、それぞれに含まれているインターフェイスに連続してアクセスすることができる列挙子インターフェイスを、すべてのインターフェイスで使用できます。 Packaging API のさらに詳しい情報については、Windows SDK の「Packaging」(パッケージ化) を参照してください。 OPC API のマネージ実装 (Managed Packaging Implementation、マネージ Packaging API の実装) に対する Packaging API のマッピングについては、「付録 A: Managed Packaging Implementation のクラスに対する Packaging API インターフェイスのマッピング」を参照してください。 ページのトップへ 3. Packaging API インターフェイスa. IOpcPackage インターフェイスIOpcPackage インターフェイスでは、パッケージを表し、図 6 に示すように IOpcPartSet インターフェイスおよび IOpcRelationshipsSet インターフェイスにアクセスすることができます。 IOpcPackage インターフェイスから取得される IOpcPartSet インターフェイスは、パッケージに含まれるすべてのパーツ (ただし、Relationships パーツを除く) を表します。 IOpcPackage インターフェイスから取得される IOpcRelationshipsSet インターフェイスは、パッケージがソースとして含まれているすべてのリレーションシップ (パッケージ リレーションシップと呼ばれます) を格納する、Relationships パーツを表します。 IOpcFactory インターフェイスでは、IOpcPackage インターフェイスを作成するメソッドが定義されています。 b. IOpcPart インターフェイスIOpcPart インターフェイスは、パッケージに含まれる 1 つのパーツを表し、図 6 と図 7 に示したように IOpcRelationshipsSet インターフェイスにアクセスできます。 IOpcPart インターフェイスでは、Content、Content type、Name、および Compression option プロパティを使用して、パーツの情報にアクセスできます。これらのプロパティの説明を次の表に示し、図 8 に図解します。
図8: Packaging API オブジェクト モデルの IOpcPart インターフェイスの詳細 図 7 と図8 に示すように、IOpcPart インターフェイスが 1 つまたは複数のリレーションシップのソースであるパーツを表している場合は、IOpcRelationshipsSet インターフェイスを取得できます。これは、ソースとして対応するパーツが含まれているリレーションシップを格納している、Relationships パーツを表します。 IOpcPackage インターフェイスから取得される IOpcPartSet インターフェイスでは、Relationships パーツではなく、パッケージ内のパーツに対応する IOpcPart オブジェクトの列挙子を作成、削除、および取得するメソッドが定義されています。 c. IOpcRelationship インターフェイスIOpcRelationship インターフェイスは、パッケージの内部または外部いずれかの、ソースおよびターゲット リソース間の方向の関連付けを示すリレーションシップを表します。 IOpcRelationship インターフェイスでは、Relationship identifier、Relationship type、Source URI、Target resource URI、および Target mode プロパティによって、リレーションシップの情報にアクセスできます。これらのプロパティの説明を次の表に示し、"図 9: Packaging API オブジェクト モデルの IOpcRelationship インターフェイスの詳細" に図解します。
図 9: Packaging API オブジェクト モデルの IOpcRelationship インターフェイスの詳細 IOpcRelationshipSet インターフェイスでは、同じソースが含まれているリレーションシップの表記を使用することができ、IOpcRelationship インターフェイスを作成および削除するメソッドが定義されています。 d. IOpcRelationshipSet インターフェイスIOpcRelationshipSet インターフェイスは、共通のソースが含まれている全リレーションシップを格納する Relationships パーツを表します。IOpcRelationshipSet インターフェイスと Relationships パーツの対応については、図 7 を参照してください。 IOpcPackage インターフェイスから取得された場合、IOpcRelationshipSet インターフェイスはパッケージ リレーションシップを格納している Relationships パーツを表します。IOpcPart インターフェイスから取得された場合、IOpcRelationshipSet インターフェイスは、(IOpcPart インターフェイスに対応する) パーツがソースとして含まれているリレーションシップを格納する、Relationships パーツを表します。IOpcRelationshipSet インターフェイスでは、IOpcRelationshipSet インターフェイスが表す Relationships パーツの、パーツ コンテンツのストリーム (Relationship XML Mmarkup: リレーションシップ XML マークアップ) にアクセスできます。 IOpcRelationshipSet インターフェイスでは、IOpcRelationshipSet インターフェイスが表す Relationships パーツに格納されるリレーションシップに対応する、IOpcRelationship オブジェクトの列挙子を作成、削除、および取得するためのメソッドが定義されています。 e. Packaging API のデジタル署名IOpcDigitalSignatureManager インターフェイスでは、署名を作成および変更できるメソッドが定義されており、パッケージのデジタル署名を表す IOpcDigitalSignature インターフェイスの列挙子にアクセスできます。IOpcDigitalSignature インターフェイスでは、署名の情報にアクセスできます。 IOpcFactory インターフェイスでは、IOpcDigitalSignatureManager インターフェイスを作成するメソッドが定義されています。 ページのトップへ 4. 詳細情報
Web アドレスは変更される可能性があるため、ここに記載されている Web サイトに接続できない場合があります。 5. 用語集
ページのトップへ 6. 付録 A: Managed Packaging Implementation のクラスに対する Packaging API インターフェイスのマッピング次の表に示すように、Managed Packaging Implementation のクラスが Win32 インターフェイスに厳密にマップされるという点で、Packaging API は、OPC API のマネージ実装 (Mmanaged Packaging Iimplementation) と非常によく似ています。
Packaging API は、マネージ Packaging API と多く類似点がありますが、次の表に示すような相違点があります。
Packaging API と managed Packaging implementation の動作の相違点については、このドキュメントでは取り上げません。これについては、Windows SDK の概要「Packaging API Behavioral Differences from the Managed Implementation」(Packaging API とマネージ Packaging API 実装の動作の相違点) で説明されています。 ページのトップへ 7. 付録 B: Relationships パーツの名前付けRelationships パーツのパーツ名は、Relationships パーツに格納されているリレーションシップのソース URI から派生します。 リレーションシップ ソースの URI は文字列として表すことができ、ソースの完全なパス (パッケージ ルートからの相対パス) と見なすことができます。パーツのパーツ名 (URI) は完全なパスと見なすことができるので、特定のソースの Relationships パーツの URI は、ソース URI から派生させることができます。 リレーションシップのソース URI から Relationships パーツのパーツ名 (URI) を取得するには
たとえば、リレーションシップに、パーツ名 (URI) が "\text\swings" というであるパーツがソースとして含まれている場合は、上記の手順によって、次のような Relationships パーツ名を取得できます。
"\text\_rels\swings.rels" という URI は、"図 4: Relationships パーツを含む単純なパッケージの階層" に示されているように適切なリレーションシップ パーツ名です。 リレーションシップのソースがパッケージである場合は、対応する Relationships パーツには、"\rels\.rels" というパーツ名 (URI) が含まれます。 |
ページのトップへ