建立簡單的週期性工作專案
適用於:Outlook 2013 |Outlook 2016
MAPI 可用來建立工作專案。 本主題描述如何建立簡單的週期性工作專案。
如需如何從 MFCMAPI 應用程式下載、檢視及執行程式代碼以及本主題所參考 CreateOutlookItemsAddin 專案的相關信息,請參閱 安裝本節中使用的範例。
若要建立工作專案
開啟訊息存放區。 如需如何開啟訊息存放區的相關信息,請 參閱開啟訊息存放區。
開啟訊息存放區中的 [工作] 資料夾。 如需詳細資訊, 請參閱 PR_IPM_TASK_ENTRYID (PidTagIpmTaskEntryId) 。
在 [工作] 資料夾上呼叫 IMAPIFolder::CreateMessage 方法,以建立新的工作專案。
將 dispidTaskRecur 設定 (PidLidTaskRecurrence) 屬性,以及建立週期性工作所需的其他工作相關屬性。
儲存新的工作專案。
AddTask
CreateOutlookItemsAddin 專案Tasks.cpp原始程式檔中的函式會示範這些步驟。 函AddTask
式會從 [新增工作] 對話框中取得參數,當您在 MFCMAPI 範例應用程式的 [載入宏] 功能表上按兩下 [新增工作] 時,就會顯示這些參數。 DisplayAddTaskDialog
Tasks.cpp中的函式會顯示對話框,並將值從對話框傳遞至AddTask
函式。 函 DisplayAddTaskDialog
式與使用MAPI建立工作項目沒有直接關聯,因此不會列於此處。
重要事項
當您按下 [載入宏] 選單上的 [新增工作] 命令時,MFCMAPI 應用程式中的程式代碼無法確保已選取 [工作] 資料夾。 在 [工作] 資料夾以外的資料夾中建立工作專案可能會導致未定義的行為。 在 MFCMAPI 應用程式中使用 [新增工作] 命令之前,請確定您已選取 [工作] 資料夾。
函 AddTask
式如下所示。 請注意,傳遞至AddTask
函式的 lpFolder 參數是 IMAPIFolder 介面的指標,代表新工作建立所在的資料夾。 假設 lpFolder 代表 IMAPIFolder 介面,程式代碼會呼叫 IMAPIFolder::CreateMessage 方法。 CreateMessage 方法會傳回成功程式代碼和 IMessage 介面指標的指標。 大部分的 AddTask
函式程式代碼會處理指定屬性的工作,以準備呼叫 IMAPIProp::SetProps 方法。 如果 呼叫 SetProps 方法成功,則會呼叫 IMAPIProp::SaveChanges 方法來認可對存放區的變更,並建立新的工作專案。
函 AddTask
式會設定一些具名屬性。 如需具名屬性及其建立方式的相關信息,請參閱 使用MAPI建立 Outlook 2007 專案。 由於用於工作專案的具名屬性會佔用多個屬性集,因此在建置參數以傳遞至 IMAPIProp::GetIDsFromNames 方法時,必須小心謹慎。
函 AddTask
式會使用 BuildWeeklyTaskRecurrencePattern
Helper 函式來建置結構,代表設定 dispidTaskRecur 屬性的工作週期。 如需函式組建的工作周期結構 BuildWeeklyTaskRecurrencePattern
資訊,請參閱 PidLidTaskRecurrence Canonical 屬性 和 PidLidRecurrencePattern Canonical 屬性。
請注意,雖然可以有各種週期模式, BuildWeeklyTaskRecurrencePattern
但函式只會建立每周週期模式。 它也會針對許多假設進行硬式編碼,例如公曆類型 (公曆) 、 (星期日) 一周的第一天,以及修改或刪除的實例數目 () 。 較一般用途的週期模式建立函式必須接受這類變數作為參數。
以下是函式的 AddTask
完整清單。
HRESULT AddTask(LPMAPIFOLDER lpFolder,
SYSTEMTIME* lpstStart, // PidLidCommonEnd, PidLidTaskDueDate, PidLidTaskRecurrence
SYSTEMTIME* lpstEnd, // PidLidTaskRecurrence
SYSTEMTIME* lpstFirstDOW, // PidLidTaskRecurrence
DWORD dwPeriod, // PidLidTaskRecurrence
DWORD dwOccurrenceCount, // PidLidTaskRecurrence
DWORD dwPatternTypeSpecific, // PidLidTaskRecurrence
LPWSTR szSubject, // PR_SUBJECT_W
LPWSTR szBody) // PR_BODY_W
{
if (!lpFolder) return MAPI_E_INVALID_PARAMETER;
HRESULT hRes = S_OK;
LPMESSAGE lpMessage = 0;
// create a message and set its properties
hRes = lpFolder->CreateMessage(0,
0,
&lpMessage);
if (SUCCEEDED(hRes))
{
MAPINAMEID rgnmid[ulTaskProps];
LPMAPINAMEID rgpnmid[ulTaskProps];
LPSPropTagArray lpNamedPropTags = NULL;
ULONG i = 0;
for (i = 0 ; i < ulTaskProps ; i++)
{
if (i < ulFirstTaskProp)
rgnmid[i].lpguid = (LPGUID)&PSETID_Common;
else
rgnmid[i].lpguid = (LPGUID)&PSETID_Task;
rgnmid[i].ulKind = MNID_ID;
rgnmid[i].Kind.lID = aulTaskProps[i];
rgpnmid[i] = &rgnmid[i];
}
hRes = lpFolder->GetIDsFromNames(
ulTaskProps,
(LPMAPINAMEID*) &rgpnmid,
NULL,
&lpNamedPropTags);
if (SUCCEEDED(hRes) && lpNamedPropTags)
{
// Because the properties to be set are known in advance,
// most of the structures involved can be statically declared
// to minimize expensive MAPIAllocateBuffer calls.
SPropValue spvProps[NUM_PROPS] = {0};
spvProps[p_PidLidTaskMode].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskMode],PT_LONG);
spvProps[p_PidLidCommonEnd].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidCommonEnd],PT_SYSTIME);
spvProps[p_PidLidTaskStatus].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskStatus],PT_LONG);
spvProps[p_PidLidPercentComplete].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidPercentComplete],PT_DOUBLE);
spvProps[p_PidLidTaskState].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskState],PT_LONG);
spvProps[p_PidLidTaskRecurrence].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskRecurrence],PT_BINARY);
spvProps[p_PidLidTaskDeadOccurrence].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskDeadOccurrence],PT_BOOLEAN);
spvProps[p_PidLidTaskOwner].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskOwner],PT_UNICODE);
spvProps[p_PidLidTaskFRecurring].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskFRecurring],PT_BOOLEAN);
spvProps[p_PidLidTaskOwnership].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskOwnership],PT_LONG);
spvProps[p_PidLidTaskAcceptanceState].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskAcceptanceState],PT_LONG);
spvProps[p_PidLidTaskFFixOffline].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskFFixOffline],PT_BOOLEAN);
spvProps[p_PidLidTaskDueDate].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskDueDate],PT_SYSTIME);
spvProps[p_PidLidTaskComplete].ulPropTag
= CHANGE_PROP_TYPE(lpNamedPropTags->aulPropTag[p_PidLidTaskComplete],PT_SYSTIME);
spvProps[p_PR_MESSAGE_CLASS_W].ulPropTag = PR_MESSAGE_CLASS_W;
spvProps[p_PR_ICON_INDEX].ulPropTag = PR_ICON_INDEX;
spvProps[p_PR_SUBJECT_W].ulPropTag = PR_SUBJECT_W;
spvProps[p_PR_MESSAGE_FLAGS].ulPropTag = PR_MESSAGE_FLAGS;
spvProps[p_PR_BODY_W].ulPropTag = PR_BODY_W;
spvProps[p_PidLidTaskMode].Value.l = tdmtNothing;
SYSTEMTIME stStartUTC = {0};
TzSpecificLocalTimeToSystemTime(NULL,lpstStart,&stStartUTC);
SystemTimeToFileTime(&stStartUTC,&spvProps[p_PidLidCommonEnd].Value.ft);
spvProps[p_PidLidTaskStatus].Value.l = tsvNotStarted;
spvProps[p_PidLidPercentComplete].Value.dbl = 0.0;
spvProps[p_PidLidTaskState].Value.l = tdsOWNNEW;
spvProps[p_PidLidTaskDeadOccurrence].Value.b = false;
spvProps[p_PidLidTaskOwner].Value.lpszW = L"Unknown";
spvProps[p_PidLidTaskFRecurring].Value.b = true;
spvProps[p_PidLidTaskOwnership].Value.l = tovNew;
spvProps[p_PidLidTaskAcceptanceState].Value.l = tdvNone;
spvProps[p_PidLidTaskFFixOffline].Value.b = true;
SystemTimeToFileTime(lpstStart,&spvProps[p_PidLidTaskDueDate].Value.ft);
spvProps[p_PidLidTaskComplete].Value.b = false;
spvProps[p_PR_MESSAGE_CLASS_W].Value.lpszW = L"IPM.Task";
spvProps[p_PR_ICON_INDEX].Value.l = 0x501; // Unassigned Recurring Task
spvProps[p_PR_SUBJECT_W].Value.lpszW = szSubject;
spvProps[p_PR_MESSAGE_FLAGS].Value.l = MSGFLAG_READ;
spvProps[p_PR_BODY_W].Value.lpszW = szBody;
hRes = BuildWeeklyTaskRecurrencePattern(
lpstStart,
lpstEnd,
lpstFirstDOW,
dwPeriod,
dwOccurrenceCount,
dwPatternTypeSpecific,
&spvProps[p_PidLidTaskRecurrence].Value.bin.cb,
&spvProps[p_PidLidTaskRecurrence].Value.bin.lpb);
if (SUCCEEDED(hRes))
{
hRes = lpMessage->SetProps(NUM_PROPS, spvProps, NULL);
if (SUCCEEDED(hRes))
{
hRes = lpMessage->SaveChanges(FORCE_SAVE);
}
}
if (spvProps[p_PidLidTaskRecurrence].Value.bin.lpb)
delete[] spvProps[p_PidLidTaskRecurrence].Value.bin.lpb;
}
MAPIFreeBuffer(lpNamedPropTags);
}
if (lpMessage) lpMessage->Release();
return hRes;
}