オートコンプリート ストリーム

適用対象: Outlook 2013 | Outlook 2016

Microsoft Outlook とオートコンプリート ストリームの相互作用の仕組みを知ることはもちろん重要ですが、オートコンプリート ストリームのバイナリ形式も理解する必要があります。

オートコンプリート ストリームは、Microsoft Outlook 2013、Microsoft Outlook 2010、Microsoft Office Outlook 2007、Microsoft Outlook 2003 のみで使用される一部のブックキーピングのメタデータと一緒にバイナリ ストリームとして保存される受信者プロパティの行の一式です。 メタデータは Outlook とオートコンプリート ストリームの相互作用に関連します。そのため、サード パーティは、オートコンプリート ストリームの変更を保存する場合、メアデータのブロックごとの内容をそのままにしておく必要があります。 つまり、サード パーティはバイナリ形式の行セットの部分のみを変更して、オートコンプリート ストリームのメタデータのブロックの内容はそのままにします。

ストリームの視覚化

以下が、オートコンプリート ストリームのレイアウトの概要になります:

メタデータ (4 バイト)

メジャー バージョン番号 (4 バイト)

マイナー バージョン番号 (4 バイト)

行 n の数 (4 バイト)

行 1 のプロパティ p の数 (4 バイト)

プロパティ 1 のプロパティ タグ (4 バイト)

プロパティ 1 の予約済みのデータ (4 バイト)

プロパティ 1 の値の和集合 (8 バイト)

プロパティ 1 の値のデータ (0 または変数バイト)

… (プロパティ P-1 を介したプロパティ 2)

プロパティ p のプロパティ タグ (4 バイト)

プロパティ p の予約済みのデータ (4 バイト)

プロパティ p の値の和集合 (8 バイト)

プロパティ p の値のデータ (0 または変数バイト)

行 2 のプロパティ q の数 (4 バイト)

… (行 2 のプロパティ)

… (行 n-1 を介した行 3)

行 n のプロパティ r の数 (4 バイト)

… (行 n のプロパティ)

追加情報のバイト数 EI (4 バイト)

追加情報 (EI バイト)

メタデータ (8 バイト)

バイナリ構造の例に関しては、「Outlook 2003/2007 NK2 のファイル形式と開発者向けガイドライン」にあるバイナリの例を参照してください。

レイアウトの概要

以下が、オートコンプリート ストリームのレイアウトの概要になります:

値データ バイト数
Metadata
4
メジャー バージョン番号
4
マイナー バージョン番号
4
行セット
変数
追加情報のバイト数 EI
4
追加情報
EI
Metadata
8

このストリームを読み取るときのメジャー バージョンが 12 でない場合は、ストリームの読み取りまたは書き込みは行われません。 現行のオートコンプリート ストリームのマイナー バージョンは 0 で、追加情報のバイト数は 0 に設定されています。 マイナー バージョンが 0 でない場合は、追加情報内に、ストリームの読み取り時に読み取る情報とストリームの書き込み時に内容を保持する情報が格納されます。 ストリームを書き込むときには、マイナー バージョンもそのままにする必要があります。 これら両方の内容が維持されていないと、追加情報を書き込んだ Outlook のインスタンスはデータを失います。

注:

アプリケーションで、カスタム データを追加情報のフィールドへ追加したり、マイナー バージョンを変更したりすることはできません。この機能は、Outlook の拡張機能の形式に対してサポートされており、任意のサードパーティの拡張機能はサポートされていません。

行セットのレイアウト

行セットのレイアウトは次のとおりです:

値データ バイト数
行数
4

変数

行数は、バイナリ ストリーム シーケンスの次の部分の行数を示します。

行のレイアウト

それぞれの行は、次の形式になります:

値データ バイト数
プロパティ数
4
プロパティ
変数

プロパティ数は、バイナリ ストリーム シーケンスの次の部分のプロパティ数を示します。

プロパティのレイアウト

それぞれのプロパティは、次の形式になります:

値データ バイト数
プロパティのタグ
4
予約済みのデータ
4
プロパティ値の和集合
値のデータ
0 または変数 (プロパティ タグによって異なる)

プロパティ値の解釈

プロパティ値の和集合と値のデータは、プロパティ ブロックの最初の 4 バイトのプロパティのタグに基づいて解釈されます。 このプロパティのタグは、MAPI プロパティのタグと同じ形式になります。 0 から 15 ビットのプロパティのタグがプロパティの種類です。 16 から 31 ビットまでがプロパティの識別子です。 プロパティの種類によって、残りのプロパティの読み取り方法が決まります。

静的な値

一部のプロパティには和集合のデータのみがあり、値のデータがありません。 以下が、(プロパティのタグに基づく) プロパティの種類それぞれにおける、8 バイトのプロパティの和集合データの解釈方法です:

プロパティの種類 プロパティの和集合の解釈
PT_I2
short int
PT_LONG
long
PT_ERROR
long
PT_R4
浮動小数点数
PT_DOUBLE
double
PT_BOOLEAN
short int
PT_SYSTIME
FILETIME
PT_I8
LARGE_INTEGER

動的な値

他のプロパティは、プロパティのタグ、予約済みのデータ、プロパティ値の和集合を含む最初の 16 バイトの次の値データのブロックにデータを持ちます。 静的な値とは異なり、8 バイトのプロパティ値の和集合に含まれているデータに関しては、読み取りは行われません。 書き込む場合は、これらの 8 バイトにデータを追加します。 ただし、8 バイトのコンテンツは重要ではありません。 動的な値では、プロパティのタグの種類によって、値データの解釈方法が決まります。

PT_STRING8

値データ バイト数
バイト n の数
4
ANSI 文字列 (NULL 終端文字を含む) として解釈されるバイト
n

PT_CLSID

値データ バイト数
GUID として解釈されるバイト
16

PT_BINARY

値データ バイト数
バイト n の数
4
バイト配列として解釈されるバイト
n

PT_MV_BINARY

値データ バイト数
バイナリ配列 X の数
4
X バイナリ配列を含むバイトの実行。 各配列は、PT_BINARY バイトの実行とまったく同じ方法で解釈される必要があります。 変数

PT_MV_STRING8 (Outlook 2007、Outlook 2010、Outlook 2013)

値データ バイト数
ANSI 文字列 X の数
4
X ANSI 文字列を含むバイトの実行。 各文字列は、PT_STRING8 バイトの実行とまったく同じ方法で解釈される必要があります。 変数

PT_MV_UNICODE (Outlook 2007、Outlook 2010、Outlook 2013)

値データ バイト数
Unicode 文字列 X の数
4
X UNICODE 文字列を含むバイトの実行。 各文字列は、PT_UNICODE バイトの実行とまったく同じ方法で解釈される必要があります。 変数

重要なプロパティ

このトピックで前述したように、プロパティを表すバイナリのブロックには、アドレス帳の受信者のプロパティに対応するプロパティ タグがあります。 ここに記載されていないプロパティについては、https://msdn.microsoft.com/library/cc433490(EXCHG.80).aspx の説明を参照してください。

プロパティ名 プロパティのタグ 説明 (詳細については、MSDN を参照してください)
PR_NICK_NAME_W (オートコンプリート ストリーム専用で、受信者には送信されません)
0x6001001f
このプロパティは、それぞれの受信者の行の先頭である必要があります。 受信者の行のキー識別子として機能します。
PR_ENTRYID
0x0FFF0102
受信者のアドレス帳エントリの識別子です。
PR_DISPLAY_NAME_W
0x3001001F
受信者の表示名です。
PR_EMAIL_ADDRESS_W
0x3003001F
受信者のメール アドレス (例: johndoe@contoso.com /o=Contoso/OU=Foo/cn=Recipients/cn=johndoe)
PR_ADDRTYPE_W
0x3002001F
受信者のアドレスの種類です (例: SMTP または EX)。
PR_SEARCH_KEY
0x300B0102
受信者の MAPI 検索キーです。
PR_SMTP_ADDRESS_W
0x39FE001f
受信者の SMTP アドレスです。
PR_DROPDOWN_DISPLAY_NAME_W (オートコンプリート ストリーム専用で、受信者には送信されません)
0X6003001f
表示文字列で、オートコンプリート一覧に表示されます。
PR_NICK_NAME_WEIGHT (オートコンプリート ストリーム専用で、受信者には送信されません)
0x60040003
このオートコンプリートの入力のウェイトです。 オートコンプリート一覧と一致する場合のオートコンプリート入力順序を決定するときに、このウェイトを使用します。 高いウェイトの入力が、低いウェイトの入力よりも先に表示されます。 完全なオートコンプリート一覧はこのプロパティによって並べ替えが行われます。 時間が経つにつれウェイトは減少しますが、この受信者にユーザーがメールを送信するとウェイトが増加します。 このプロパティの詳細については、このトピックの後半に記載されている説明を参照してください。

PR_NICK_NAME_WEIGHT

オートコンプリート ストリームの行の一式は、PR_NICK_NAME_WEIGHT によって降順に並べ替えられます。オートコンプリート ストリームは常にこの並べ替えられた内容を維持する必要があります。 したがって、行のウェイトを変更するときは必ず、行の位置が行全体で並べ替えられた順序と一致しているかどうかを確認する必要があります。 行セットへの追加を行うときは、並べ替えの順序を乱さないように正しい位置に追加する必要があります。

このウェイトの最小値は 0x1 で、最大値は LONG_MAX です。 他のウェイトの値は無効と見なされます。

Outlook 2007 によってメールが送信されたり受信者が解決された場合、その受信者のウェイトは 0x2000 ずつ増加します。