開啟附件
適用於:Outlook 2013 |Outlook 2016
開啟附件牽涉到顯示其數據。 例如,開啟檔案附件時,會顯示檔案的內容。 雖然訊息和資料夾是使用其專案標識碼來開啟,但附件會使用其附件編號來開啟, PR_ATTACH_NUM 屬性。 如需詳細資訊, 請參閱 PR_ATTACH_NUM (PidTagAttachNumber) 。 附件編號可透過訊息的附件數據表取得。
開啟訊息中的所有附件
呼叫訊息的 IMessage::GetAttachmentTable 方法以存取其附件數據表。
呼叫 HrQueryAllRows 以擷取數據表中的所有數據列。
針對每個資料欄位:
在呼叫訊息的 IMessage::OpenAttach 方法時,傳遞PR_ATTACH_NUM數據行中所代表的附件編號,以開啟附件。 如需詳細資訊,請參閱 IMessage::OpenAttach。 OpenAttach 會傳回 IAttach 實作的指標,以提供附件屬性的存取權。
呼叫附件的 IMAPIProp::GetProps 方法以擷取其 PR_ATTACH_METHOD 屬性。 如需詳細資訊,請參閱 IMAPIProp::GetProps 和 PR_ATTACH_METHOD (PidTagAttachMethod) 。
如果 PR_ATTACH_METHOD 設為 ATTACH_BY_REF_ONLY,請呼叫 IMAPIProp::GetProps 來擷取 PR_ATTACH_PATHNAME 屬性。 如需詳細資訊, 請參閱 PR_ATTACH_PATHNAME (PidTagAttachPathname) 。
如果PR_ATTACH_METHOD設為 ATTACH_BY_VALUE,請呼叫 IMAPIProp::OpenProperty 以使用 IStream 介面開啟 PR_ATTACH_DATA_BIN 屬性。 請參閱此程序之後的範例程序代碼。 如需詳細資訊,請參閱 IMAPIProp::OpenProperty 和 PR_ATTACH_DATA_BIN (PidTagAttachDataBinary) 。
如果 PR_ATTACH_METHOD 設為 ATTACH_OLE,且附件是 OLE 2 物件:
呼叫 IMAPIProp::OpenProperty 以使用 IStreamDocfile 介面開啟 PR_ATTACH_DATA_OBJ 屬性。 嘗試使用這個介面,因為它是 IStream 的實作,保證可以使用具有最少額外負荷的結構化記憶體。 如需詳細資訊, 請參閱 PR_ATTACH_DATA_OBJ (PidTagAttachDataObject) 。
如果OpenProperty呼叫失敗,請再次呼叫它,以使用IStreamDocfile介面擷取PR_ATTACH_DATA_BIN屬性。
如果第二個 OpenProperty 呼叫失敗,請再次嘗試呼叫 OpenProperty 以擷取 PR_ATTACH_DATA_OBJ。 不過,請指定 IStorage 介面,而不是指定 IStreamDocfile。
如果 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 屬性中開啟數據。 它會將指標配置給兩個數據流:一個用於檔案,另一個用於附件。 OpenStreamOnFile 函式會以唯讀模式開啟檔案數據流。 呼叫附件的 IMAPIProp::OpenProperty 方法會以讀取/寫入模式開啟附件數據流。 如需詳細資訊, 請參閱 PR_ATTACH_DATA_BIN、 OpenStreamOnFile 和 IMAPIProp::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();
}