添付ファイルを開く

適用対象: Outlook 2013 | Outlook 2016

添付ファイルを開くと、そのデータが表示されます。 たとえば、添付ファイルを開くと、ファイルの内容が表示されます。 メッセージとフォルダーはエントリ識別子を使用して開かれますが、添付ファイルは添付ファイル番号 ( PR_ATTACH_NUM プロパティ) を使用して開かれます。 詳細については、「 PR_ATTACH_NUM (PidTagAttachNumber)」を参照してください。 添付ファイル番号は、メッセージの添付ファイル テーブルから使用できます。

メッセージ内のすべての添付ファイルを開くには

  1. メッセージの IMessage::GetAttachmentTable メソッドを呼び出して、添付ファイル テーブルにアクセスします。

  2. HrQueryAllRows を呼び出して、テーブル内のすべての行を取得します。

  3. 各行について:

    1. メッセージの IMessage::OpenAttach メソッドの呼び出しで、PR_ATTACH_NUM列で表される添付ファイル番号を渡して添付ファイルを開きます。 詳細については、「 IMessage::OpenAttach」を参照してください。 OpenAttach は、添付ファイル プロパティへのアクセスを提供する IAttach 実装へのポインターを返します。

    2. 添付ファイルの IMAPIProp::GetProps メソッドを呼び出して 、PR_ATTACH_METHOD プロパティを取得します。 詳細については、「 IMAPIProp::GetProps and PR_ATTACH_METHOD (PidTagAttachMethod)」を参照してください。

    3. PR_ATTACH_METHODが ATTACH_BY_REF_ONLY に設定されている場合は、IMAPIProp::GetProps を呼び出して、PR_ATTACH_PATHNAME プロパティを取得します。 詳細については、「 PR_ATTACH_PATHNAME (PidTagAttachPathname)」を参照してください。

    4. PR_ATTACH_METHODが ATTACH_BY_VALUE に設定されている場合は、IMAPIProp::OpenProperty を呼び出して、IStream インターフェイスを使用して PR_ATTACH_DATA_BIN プロパティを開きます。 この手順に従うサンプル コードを参照してください。 詳細については、「 IMAPIProp::OpenPropertyPR_ATTACH_DATA_BIN (PidTagAttachDataBinary)」を参照してください。

    5. PR_ATTACH_METHODが ATTACH_OLE に設定され、添付ファイルが OLE 2 オブジェクトの場合:

      1. IMAPIProp::OpenProperty を呼び出して、IStreamDocfile インターフェイスを使用して PR_ATTACH_DATA_OBJ プロパティを開きます。 このインターフェイスの使用は、オーバーヘッドが最小限の構造化ストレージで動作することが保証された IStream の実装であるためです。 詳細については、「 PR_ATTACH_DATA_OBJ (PidTagAttachDataObject)」を参照してください。

      2. OpenProperty 呼び出しが失敗した場合は、もう一度呼び出して、IStreamDocfile インターフェイスを使用して PR_ATTACH_DATA_BIN プロパティを取得します。

      3. この 2 回目 の OpenProperty 呼び出しが失敗した場合は、もう一度 OpenProperty を呼び出して PR_ATTACH_DATA_OBJを取得してみてください。 ただし、 IStreamDocfile を指定するのではなく、 IStorage インターフェイスを指定します。

  4. PR_ATTACH_METHODが ATTACH_EMBEDDED_MSG に設定されている場合、PR_ATTACH_DATA_OBJの値にエラーが含まれるのは珍しいことではありません。 これは、あなたとテーブル実装者が返すオブジェクトの種類に同意する方法がないためです。 添付されたメッセージへのポインターを取得するには、 IMessage::OpenAttach を使用して添付ファイルを開きます。 その後、 IMAPIProp::OpenProperty メソッドを呼び出して添付ファイル データにアクセスします。 詳細については、「 IMessage::OpenAttach 」および「 IMAPIProp::OpenProperty」を参照してください。

添付ファイルを読み取り/書き込みモードまたは読み取り専用モードで開くように要求できます。 読み取り専用は既定のモードであり、多くのメッセージ ストア プロバイダーは、クライアントの要求に関係なく、このモードですべての添付ファイルを開きます。 MAPI_BEST_ACCESS フラグを渡して、メッセージ ストア プロバイダーがアクセスできる最高レベルのアクセス権を要求し、開いている添付ファイルの PR_ACCESS_LEVEL プロパティを取得して、実際に付与されたアクセスレベルを決定します。 詳細については、「 PR_ACCESS_LEVEL (PidTagAccessLevel)」を参照してください。

次の例は、添付ファイルの PR_ATTACH_DATA_BIN プロパティでデータを開く方法を示しています。 ファイル用と添付ファイル用の 2 つのストリームへのポインターを割り当てます。 OpenStreamOnFile 関数は、読み取り専用モードでファイル ストリームを開きます。 添付ファイルの IMAPIProp::OpenProperty メソッドを呼び出すと、添付ファイル ストリームが読み取り/書き込みモードで開きます。 詳細については、「 PR_ATTACH_DATA_BINOpenStreamOnFileIMAPIProp::OpenProperty」を参照してください。 その後、コードはファイル ストリームから添付ファイル ストリームにコピーし、両方のストリームを解放します。

LPSTREAM pStreamFile, pStreamAtt;
HRESULT hr;
hr = OpenStreamOnFile (MAPIAllocateBuffer, MAPIFreeBuffer,
                       STGM_READ, "myfile.doc", NULL, &pStreamFile);
if (HR_SUCCEEDED(hr))
{
    // Open the destination stream in the attachment object
    hr = pAttach->OpenProperty (PR_ATTACH_DATA_BIN,
                                &IID_IStream,
                                0,
                                MAPI_MODIFY | MAPI_CREATE,
                                (LPUNKNOWN *)&pStreamAtt);
    if (HR_SUCCEEDED(hr))
    {
        STATSTG StatInfo;
        pStreamFile->Stat (&StatInfo, STATFLAG_NONAME);
        hResult = pStreamFile->CopyTo (pStreamAtt, StatInfo.cbSize,
                                       NULL, NULL);
        pStreamAtt->Release();
    }
    pStreamFile->Release();
}