次の方法で共有


PDC 2008

Open Packaging Conventions ファイル用の Win32 API

更新日: 2009 年 4 月 28 日


ダウンロード

PDC08_Packaging_JPN.docx (Word 形式、926 KB)


目次:

  1. はじめに
  2. Packaging API オブジェクト モデル
  3. Packaging API インターフェイス
  4. 詳細情報
  5. 用語集
  6. 付録 A: Managed Packaging Implementation のクラスに対する Packaging API インターフェイスのマッピング
  7. 付録 B: Relationships パーツの名前付け

Jack Davis
Miriam Wallace
Microsoft Corporation
2008 年 10 月

対象:

Windows® 7

要約:

このドキュメントでは、Office Open XML ファイル形式 (ECMA-376 標準) に準拠するカスタム コンテナー ファイルの Open Packaging Conventions (OPC) API の Win32 実装の概要について説明します。また、OPC の主要概念の紹介、この概念の Win32 実装へのマッピングに関する説明を行い、2 つの付録では、Win32 と OPC API のマネージ実装の対応とパッケージに関連した URI の文字列表記について説明します。

法的通知:

このドキュメントは暫定版であり、このソフトウェアの最終的な製品版の発売時に実質的に変更されることがあります。
このドキュメントに記載されている情報は、このドキュメントの発行時点におけるマイクロソフトの見解を反映したものです。変化する市場状況に対応する必要があるため、このドキュメントは、記載された内容の実現に関するマイクロソフトの確約とはみなされないものとします。また、発行以降に発表される情報の正確性に関して、マイクロソフトはいかなる保証もいたしません。
このホワイト ペーパーに記載された内容は情報の提供のみを目的としており、明示、黙示または法律の規定にかかわらず、これらの情報についてマイクロソフトはいかなる責任も負わないものとします。
お客様ご自身の責任において、適用されるすべての著作権関連法規に従ったご使用を願います。このドキュメントのいかなる部分も、米国 Microsoft Corporation の書面による許諾を受けることなく、その目的を問わず、どのような形態であっても、複製または譲渡することは禁じられています。ここでいう形態とは、複写や記録など、電子的な、または物理的なすべての手段を含みます。ただしこれは、著作権法上のお客様の権利を制限するものではありません。
マイクロソフトは、このドキュメントに記載されている内容に関し、特許、特許申請、商標、著作権、またはその他の無体財産権を有する場合があります。別途マイクロソフトのライセンス契約上に明示の規定のない限り、このドキュメントはこれらの特許、商標、著作権、またはその他の無体財産権をお客様に許諾するものではありません。
© 2008 Microsoft Corporation. All rights reserved.
Microsoft、MS-DOS、Windows、Windows NT、Windows Server、Windows Vista、Active Directory、ActiveSync、ActiveX、Direct3D、DirectDraw、DirectInput、DirectMusic、DirectPlay、DirectShow、DirectSound、DirectX、Expression、FrontPage、HighMAT、Internet Explorer、JScript、Microsoft Press、MSN、Outlook、PowerPoint、SideShow、Silverlight、Visual Basic、Visual C++、Visual InterDev、Visual J++、Visual Studio、WebTV、Windows Media、Win32、Win32s、および Zune は米国 Microsoft Corporation の米国またはその他の国における登録商標または商標です。
記載されている会社名、製品名には、各社の商標のものもあります。


1. はじめに

Open Packaging Conventions (OPC) は、コンテナー ファイル テクノロジの仕様です。これは、Office Open XML の ISO/IEC 標準と ECMA 標準のファイル形式の基盤となっています。OPC 仕様では、ファイル形式の設計担当者に対して、アプリケーション ファイルやリソースを格納するための、アクセスが容易で、柔軟性のある、カスタムの圧縮ファイルの形式を作成するためのガイドラインを提供しています。OPC ベースのカスタムの形式を使用しているファイルを "パッケージ" と呼びます。

OPC は、業界標準のコンテナー ファイル テクノロジで、これを使用すると、アプリケーションではデータや関連リソースを、移植可能でアクセスしやすい 1 つのファイルに格納することができます。また、主要な物理フォーマットとしては、標準的な ZIP ファイルが使用されます。この新しいファイル パッケージ化テクノロジは、いくつかの主要なマイクロソフト アプリケーションで既に採用されています。

  • Open Packaging Conventions は、Word (.docx)、Excel (.xlsx)、PowerPoint (.pptx) といった Microsoft® Office 2007 ドキュメントの、新しいファイル テクノロジの標準です。
  • Open Packaging Conventions は、XML Paper Specification (XPS)(.xps) ドキュメントの基盤として使用されています。これは、Windows Vista® および Windows® 7 オペレーティング システムのネイティブなアーカイブ ドキュメント形式および印刷スプール ドキュメント形式です。
  • Open Packaging Conventions のマネージ API のサポートは Windows Vista および Windows 7 に組み込まれており、Windows XP および Windows Server 2003 で使用できるように .NET Framework 3.0 に含められています。
  • Open Packaging Conventions の Win32 API のサポートは Windows 7 に組み込まれています。

複数のデータ ファイルを 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: パッケージのパーツとリレーションシップの役割

図 1: パッケージのパーツとリレーションシップの役割

パーツ

物理パッケージにおいて、パーツはファイル システムのファイルに似ています。パーツは、ファイル システムのフォルダー構成と同じように、階層構造になっています。図 2 では、単純なパッケージを使用して、この構成上の共通点を示しています。

パーツとファイルには共通点がありますが、パーツはファイルとは区別されます。パーツは、OPC 仕様で規定されているプロパティを使用する、バイトのストリームとして定義されます。図 2 に示すように、Name プロパティの値 (パーツ名) は、パッケージ ルートからのパーツの URI です (Name プロパティおよびパーツのその他のプロパティの詳細については、OPC 仕様を参照してください)。

図 2: 単純なパッケージの階層構成 (パーツ名は引用符内に記載)

図 2: 単純なパッケージの階層構成 (パーツ名は引用符内に記載)

図 2 に示すように、パーツ名は文字列として表すことができます。この文字列はファイルの完全なパスと似ており、ファイル システムでファイルの名前とパスを指定する際と同様の規則の多くに従います。パーツ名の詳細については、OPC 仕様を参照してください。パッケージ内の階層構造と URI ベースのパーツの名前付けによって、OPC 仕様に基づいてカスタム ファイル形式を作成するパッケージの設計担当者は、各自の形式およびアプリケーションのニーズに最適なパッケージ オブジェクトの論理グループを自由に選択できます。

リレーションシップ

リレーションシップは、リソースの "ソース" と "ターゲット" 間の、方向の関連付けを定義します。リレーションシップのソースは、パーツまたはパッケージです。リレーションシップのターゲットには、パッケージの内側または外側にある、URI アドレスを指定できる任意のリソースを指定できます。パッケージとパーツはどちらも URI アドレスを指定できるので、両方ともリレーションシップのターゲットに指定できます。たとえば、図 3 は、ソースが "\text\swings" パーツで、ターゲットが "\images\tire_swing.jpg" パーツというリレーションシップを概念的に表したものです。

図 3: 2 つのパーツを関連付けているリレーションシップを概念的に表したす単純なパッケージ

図 3: 2 つのパーツを関連付けているリレーションシップを概念的に表したす単純なパッケージ

リレーションシップでによって定義される関連付けは、"リレーションシップ マークアップ" と呼ばれる XML マークアップを使用して表されます。リレーションシップ マークアップは、Relationships パーツと呼ばれる特殊なパーツのパーツ コンテンツとして格納されます。リレーションシップのソースとなっている各パッケージまたはパーツは、各自のリレーションシップ マークアップをそれぞれの Relationships パーツに格納します。リレーションシップ マークアップに関する詳細については、OPC 仕様を参照してください。

たとえば、図 3 のリレーションシップがパッケージに追加された場合、パッケージの階層には、図 4 のように Relationships パーツが追加されます。

図 4: Relationships パーツを含む単純なパッケージの階層

図 4: Relationships パーツを含む単純なパッケージの階層

図 4 の Relationships パーツを含む単純なパッケージの階層 の Relationships パーツのパーツ コンテンツ (リレーションシップ マークアップ) を図 5 に示します。

図 5: 単純なパッケージの階層の Relationships パーツの詳細

図 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 インターフェイスによって表されます。

OPC の概念 Packaging API の表現
パッケージ IOpcPackage インターフェイス
パーツ IOpcPart インターフェイス
リレーションシップ IOpcRelationship インターフェイス
Relationships パーツ IOpcRelationshipSet インターフェイス

図 6: Packaging API オブジェクト モデル (OPC の主要概念を表しているインターフェイスでは概念がかっこ書きで記載され、その他のインターフェイスは API 固有と記載)

図 6: Packaging API オブジェクト モデル (OPC の主要概念を表しているインターフェイスでは概念がかっこ書きで記載され、その他のインターフェイスは API 固有と記載)

Packaging API の IOpcFactory インターフェイスでは、この主要概念およびデジタル署名の機能を表すインターフェイスにアクセスできます。IOpcFactory インターフェイスは、CoCreateInstance を呼び出して作成できます。
階層によって表される簡単なパッケージは、図 6 に示す Packaging API オブジェクト モデルを使用して表すこともできます。図 7に、この 2 つのパッケージの表記を並べて示します。

図 7: 階層および Packaging API オブジェクト モデルによって表される単純なパッケージ

図 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 に図解します。

プロパティ 説明
Content OPC 仕様で規定されているパーツを構成するバイトのストリームです。
Content type 形式の設計担当者によって指定された、パーツ コンテンツのメディアの種類です。
Name パッケージに含まれるパーツの URI です。
Compression option パーツ コンテンツで使用する圧縮のオプションです。

図8: Packaging API オブジェクト モデルの IOpcPart インターフェイスの詳細

図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 インターフェイスの詳細" に図解します。

プロパティ 説明
Relationship identifier リレーションシップの一意の識別子です。
Relationship type OPC パッケージのデザイン担当者によって定義された、リレーションシップの修飾名です。
Source URI リレーションシップのソースの URI です。ソース URI には、パッケージまたはパーツの URI を指定できます。
Target resource URI リレーションシップのターゲット リソースの 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. 用語集

  • パッケージ コンポーネント
    パッケージに含まれるパーツ、リレーションシップ、およびコンテンツ タイプを表す XML。
  • パッケージ リレーションシップ
    ソースがパッケージであるリレーションシップ。パッケージ リレーションシップは、"\_rels\.rels" Relationships パーツに格納されます。
  • パーツ
    OPC 仕様によって定義されているとおりです。IOpcPart インターフェイスによって表されます。
  • パーツ コンテンツ
    パーツのバイト ストリーム。
  • part content type (パーツ コンテンツの種類)
    RFC 2626 の 3.7 の定義と構文に一致する、パーツのコンテンツのメディアの種類。
  • パーツ名
    パッケージ ルートからの、パーツの URI。ファイルの完全なパスと類似しています。
  • リレーションシップ
    OPC 仕様で定義されている、ソースとターゲット リソース間の方向の関連付け。IOpcRelationship インターフェイスによって表されます。
  • リレーションシップ マークアップ
    リレーションシップを表すために使用される XML マークアップ。
  • Relationships パーツ
    OPC 仕様で定義されている、リレーションシップ マークアップを格納する特殊なパーツ。IOpcRelationshipSet インターフェイスによって表されます。
  • リソース
    URI アドレスを指定できる任意の内部オブジェクトまたは外部オブジェクト。
  • ソース
    リレーションシップのソースとなるパッケージまたはパーツ。
  • ターゲット
    リレーションシップのターゲットとなるリソース。

ページのトップへ


6. 付録 A: Managed Packaging Implementation のクラスに対する Packaging API インターフェイスのマッピング

次の表に示すように、Managed Packaging Implementation のクラスが Win32 インターフェイスに厳密にマップされるという点で、Packaging API は、OPC API のマネージ実装 (Mmanaged Packaging Iimplementation) と非常によく似ています。

マネージ Packaging API Packaging API
Package クラス IOpcPackage インターフェイス
PackagePart クラス IOpcPart インターフェイス
PackageRelationship クラス IOpcRelationship インターフェイス
PackageDigitalSignature クラス IOpcDigitalSignature インターフェイス

Packaging API は、マネージ Packaging API と多く類似点がありますが、次の表に示すような相違点があります。

マネージ Packaging API Packaging API
パッケージを作成、保存、および読み込むためのメソッドが Package クラスで提供されます。 パッケージを作成、保存、および読み込むためのメソッドが IOpcFactory インターフェイスで提供されます。
URI のユーティリティ メソッドは、PackUriHelper クラスで提供されます。 URI のユーティリティ メソッドは、必要に応じて IOpcUri、IOpcPartUri、および IOpcFactory インターフェイスに分類されます。

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) を取得するには

  1. 元のソース URI の、ソースのパスの末尾に、"\_rels" セグメントを挿入します。この操作によって、パッケージ内にパーツが配置されているサブフォルダーが作成されます。
  2. 表示された文字列に、.rels という拡張子を追加します。

たとえば、リレーションシップに、パーツ名 (URI) が "\text\swings" というであるパーツがソースとして含まれている場合は、上記の手順によって、次のような Relationships パーツ名を取得できます。

  1. "_rels" セグメントを挿入して、"\text\_rels\swings" とします。
  2. "\text\_rels\swings" に .rels という拡張子を追加して、"\text\_rels\swings.rels" とします。

"\text\_rels\swings.rels" という URI は、"図 4: Relationships パーツを含む単純なパッケージの階層" に示されているように適切なリレーションシップ パーツ名です。

リレーションシップのソースがパッケージである場合は、対応する Relationships パーツには、"\rels\.rels" というパーツ名 (URI) が含まれます。

ページのトップへ