次の方法で共有


OpenIMsgOnIStg

適用対象: Outlook 2013 | Outlook 2016

メッセージ セッション内で使用するために、既存の OLE IStorage オブジェクトの上に新しい IMessage オブジェクトを構築します。

プロパティ
ヘッダー ファイル:
Imessage.h
実装元:
MAPI
呼び出し元:
クライアント アプリケーションとサービス プロバイダー
SCODE OpenIMsgOnIStg(
  LPMSGSESS lpMsgSess,
  LPALLOCATEBUFFER lpAllocateBuffer,
  LPALLOCATEMORE lpAllocateMore,
  LPFREEBUFFER lpFreeBuffer,
  LPMALLOC lpmalloc,
  LPVOID lpMapiSup,
  LPSTORAGE lpStg,
  MSGCALLRELEASE FAR * lpfMsgCallRelease,
  ULONG ulCallerData,
  ULONG ulFlags,
  LPMESSAGE FAR * lppMsg
);

パラメーター

lpMsgSess

[in]新しい IMessage-on- IStorage オブジェクトを作成するメッセージ セッション オブジェクトへのポインター。

lpAllocateBuffer

[in]メモリの割り当てに使用する MAPIAllocateBuffer 関数へのポインター。

lpAllocateもっと

[in]追加のメモリを割り当てるために使用する MAPIAllocateMore 関数へのポインター。

lpFreeBuffer

[in]メモリを解放するために使用する MAPIFreeBuffer 関数へのポインター。

lpMalloc

[in]OLE IMalloc インターフェイスを公開するメモリ アロケーター オブジェクトへのポインター。 IMessage インターフェイスは、IStorageIStream などのインターフェイスを操作するときに、この割り当て方法を使用する必要があります。

lpMapiSup

[in]サービス プロバイダーが IMAPISupport : IUnknown インターフェイスのメソッドを呼び出すために使用できる MAPI サポート オブジェクトへの省略可能なポインター。

lpStg

[in, out]開き、読み取り専用または読み取り/書き込みアクセス許可を持つ OLE IStorage オブジェクトへのポインター。 IMessage は書き込み専用アクセスをサポートしていないため、OpenIMsgOnIStg は書き込み専用モードで開かれたストレージ オブジェクトを受け入れません。

lpfMsgCallRelease

[in]IMessage-on- IStorage オブジェクトの最後のリリースに続いて MAPI が呼び出す MSGCALLRELEASE プロトタイプに基づくコールバック関数への省略可能なポインター。

ulCallerData

[in] IMessage on- IStorage オブジェクトを使用して MAPI によって保存され、 MSGCALLRELEASE ベースのコールバック関数に渡される呼び出し元データ。 データは、解放される IMessage オブジェクトと、そのオブジェクトがビルドされた上の IStorage オブジェクトに関するコンテキストを提供します。

ulFlags

[in]クライアント アプリケーションまたはサービス プロバイダーが IMessage::SaveChanges メソッドを呼び出すときに OLE IStorage::Commit メソッドを呼び出すかどうかを制御するために使用されるフラグのビットマスク。 次のフラグを設定できます。

IMSG_NO_ISTG_COMMIT

OLE メソッド IStorage::Commit は、クライアントまたはプロバイダーが SaveChanges を呼び出すときに呼び出されません。

MAPI_UNICODE

Unicode .msg ファイルの作成を有効にします。 結果の IMessage ファイルは、PR_STORE_SUPPORT_MASKに STORE_UNICODE_OK を表示し、Unicode プロパティをサポートします。

注:

MAPI_UNICODE フラグは、Outlook 2003 以降のこの関数でのみサポートされます。

lppMsg

[out]開かれた IMessage オブジェクトへのポインターへのポインター。

戻り値

S_OK

�ʘb���������A�\�������l�܂��͒l���Ԃ���܂��B

注釈

プロパティ属性には、 IMAPIProp : IUnknown インターフェイスを実装するオブジェクトというプロパティ オブジェクトでのみアクセスできます。 OLE 構造化ストレージ オブジェクトで MAPI プロパティを使用できるようにするには、OpenIMsgOnIStg によって、OLE IStorage オブジェクトの上に IMessage : IMAPIProp オブジェクトがビルドされます。 このようなオブジェクトのプロパティ属性は 、SetAttribIMsgOnIStg で設定または変更でき、 GetAttribIMsgOnIStg で取得できます。

呼び出し側への注意

OpenIMsgOnIStg が呼び出される前に、メッセージ セッションを OpenIMsgSession で開く必要があります。 有効な lpMsgSess パラメーターを指定すると、新しいメッセージがメッセージ セッション内に作成され、セッションが閉じられたときに閉じられます。 lpMsgSess が NULL の場合、メッセージはメッセージ セッションとは無関係に作成されます。 メッセージを作成したクライアント アプリケーションまたはサービス プロバイダーが、すべての添付ファイルと開いているテーブルを解放しない場合、メモリがリークされ、アプリケーションが終了する可能性があります。

MAPI では、ほとんどのメモリ割り当てと割り当て解除に lpAllocateBufferlpAllocateMorelpFreeBuffer が指す関数を使用します。特に、IMAPIProp::GetProps や IMAPITable::QueryRows などのオブジェクト インターフェイスを呼び出すときにクライアント アプリケーションで使用するメモリを割り当てます。 OpenIMsgOnIStg 関数が有効な lpMapiSup パラメーターで呼び出される場合、lpAllocateBufferlpAllocateMorelpFreeBuffer ポインターは省略可能です。

基になる OLE オブジェクトを扱うため、MAPI でも OLE メモリ割り当てを使用する必要があります。 OLE 構造化ストレージ オブジェクトと OLE メモリ割り当ての詳細については、「 OLE プログラマリファレンス」を参照してください

lpMapiSup に有効な値が指定されている場合、IMessageIMAPISupport::D oProgressDialog メソッドを呼び出して IMAPIProp::CopyTo メソッドと IMessage::D eleteAttach メソッドの進行状況ユーザー インターフェイスを提供することで、MAPI_DIALOGフラグと ATTACH_DIALOG フラグをサポートします。 また、 IMessage::ModifyRecipients メソッドは、 IMAPISupport::OpenAddressBook メソッドを呼び出して、結果のアドレス帳オブジェクトを呼び出すことで、短期エントリ識別子を長期エントリ識別子に変換しようとします。 lpMapiSup に NULL が渡された場合、IMessage はMAPI_DIALOGを無視し、ATTACH_DIALOGし、変換せずに短期エントリ識別子を格納します。

lpStg パラメーターが指す IStorage オブジェクトは、STGM_READ モードまたはSTGM_READWRITE モードで開く必要があります。 STGM_READWRITE モードを使用する場合は、STGM_TRANSACTED モードも設定する必要があります。

lpfMsgCallRelease パラメーターによって指されるコールバック関数は省略可能です。指定した場合は、MSGCALLRELEASE 関数プロトタイプに基づいている必要があります。 IMessage インターフェイスは、IMessage-on- IStorage オブジェクトの参照カウントが Release メソッドの最後の呼び出しによって 0 に設定されると、それを呼び出します。 コールバック関数は、基になる IStorage インターフェイスを解放するために一般的に使用されます。 IMessage は、コールバックを行った後、lpStg パラメーターによって指される IStorage オブジェクトへのアクセスを試みません。

一部のクライアントまたはプロバイダーは、SaveChanges メソッドが呼び出されたときに IMessage 自体が書き込むデータを超えてIStorage オブジェクトに追加のデータを書き込む場合があります。 クライアントまたはプロバイダーは、IMSG_NO_ISTG_COMMIT フラグを使用して、SaveChanges 呼び出しの処理中に IMessage が OLE IStorage::Commit メソッドを呼び出さないようにすることができます。この場合、クライアントまたはプロバイダーは、追加のデータが書き込まれるときに IStorage オブジェクトをコミットする必要があります。 これを支援するために、 IMessage 実装では、 IStorage オブジェクトで作成するすべてのサブストレージに、文字列 "__" (つまり、2 つのアンダースコア) で始まる名前を付ける必要があります。 クライアントまたはプロバイダーは、サブストレージ名をこの名前空間から除外することで、名前の競合を回避できます。

MAPI では、添付ファイル、ストリーム、埋め込みメッセージなど、メッセージのサブオブジェクトに対して実行される複数の開いている操作の動作は定義されません。 MAPI では現在、既に開いているサブオブジェクトをもう一度開けますが、MAPI は、既存の開いているオブジェクトの参照カウントをインクリメントし、 IMessage::OpenAttach または IMAPIProp::OpenProperty メソッドを呼び出したクライアントまたはプロバイダーに返すことで、開いている操作を実行します。 つまり、サブオブジェクトに対する最初のオープン操作に対して要求されたアクセスは、操作によって要求されたアクセスに関係なく、後続のすべてのオープン操作に対して提供されるアクセスです。

添付ファイルにメッセージを配置するための正しい手順は、IID_IMessageのインターフェイス識別子を使用して IMAPIProp::OpenProperty メソッドを呼び出す方法です。 現在、OpenProperty では、OLE IStorage インターフェイスで直接使用できるメッセージ添付ファイルの作成もサポートされています。つまり、IID_IStorage インターフェイス識別子を使用します。 IStorage アクセスは、MICROSOFT Word ドキュメントを OLE IStream インターフェイスに変換せずに添付ファイルに簡単に挿入できるようにするためにサポートされています。 ただし、OpenIMsgOnIStg が添付ファイル データへの IStorage ポインターを渡した後、オブジェクトが間違った順序で解放された場合、IMessage は予測どおりに動作しない可能性があります。

MFCMAPI リファレンス

MFCMAPI のサンプル コードについては、次の表を参照してください。

ファイル 関数 コメント
File.cpp
LoadMSGToMessage
MFCMAPI では、 OpenIMsgOnIStg メソッドを使用して、 の上に IMessage インターフェイスを開きます。ファイルを MAPI で操作できるように MSG ファイル。

関連項目