共用方式為


開啟附件

適用於:Outlook 2013 |Outlook 2016

開啟附件牽涉到顯示其數據。 例如,開啟檔案附件時,會顯示檔案的內容。 雖然訊息和資料夾是使用其專案標識碼來開啟,但附件會使用其附件編號來開啟, PR_ATTACH_NUM 屬性。 如需詳細資訊, 請參閱 PR_ATTACH_NUM (PidTagAttachNumber) 。 附件編號可透過訊息的附件數據表取得。

開啟訊息中的所有附件

  1. 呼叫訊息的 IMessage::GetAttachmentTable 方法以存取其附件數據表。

  2. 呼叫 HrQueryAllRows 以擷取數據表中的所有數據列。

  3. 針對每個資料欄位:

    1. 在呼叫訊息的 IMessage::OpenAttach 方法時,傳遞PR_ATTACH_NUM數據行中所代表的附件編號,以開啟附件。 如需詳細資訊,請參閱 IMessage::OpenAttachOpenAttach 會傳回 IAttach 實作的指標,以提供附件屬性的存取權。

    2. 呼叫附件的 IMAPIProp::GetProps 方法以擷取其 PR_ATTACH_METHOD 屬性。 如需詳細資訊,請參閱 IMAPIProp::GetPropsPR_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. 如果第二個 OpenProperty 呼叫失敗,請再次嘗試呼叫 OpenProperty 以擷取 PR_ATTACH_DATA_OBJ。 不過,請指定 IStorage 介面,而不是指定 IStreamDocfile

  4. 如果 PR_ATTACH_METHOD 設為 ATTACH_EMBEDDED_MSG, 則PR_ATTACH_DATA_OBJ 的值包含錯誤並不罕見。 這是因為您和資料表實作者無法同意要傳回的物件類型。 若要擷取附加訊息的指標,請使用 IMessage::OpenAttach 開啟附件。 然後呼叫附件數據的 IMAPIProp::OpenProperty 方法來存取附件數據。 如需詳細資訊,請參閱 IMessage::OpenAttachIMAPIProp::OpenProperty

您可以要求以讀取/寫入或只讀模式開啟附件。 只讀是預設模式,而且不論用戶端要求什麼,許多訊息存放區提供者都會在此模式中開啟所有附件。 傳遞MAPI_BEST_ACCESS旗標,要求訊息存放區提供者授與其可存取權的最高層級,然後擷取開啟附件的 PR_ACCESS_LEVEL 屬性,以判斷實際授與的存取層級。 如需詳細資訊, 請參閱 PR_ACCESS_LEVEL (PidTagAccessLevel) 。

下列範例示範如何在附件的 PR_ATTACH_DATA_BIN 屬性中開啟數據。 它會將指標配置給兩個數據流:一個用於檔案,另一個用於附件。 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();
}