共用方式為


建立簡單的週期性工作專案

適用於:Outlook 2013 |Outlook 2016

MAPI 可用來建立工作專案。 本主題描述如何建立簡單的週期性工作專案。

如需如何從 MFCMAPI 應用程式下載、檢視及執行程式代碼以及本主題所參考 CreateOutlookItemsAddin 專案的相關信息,請參閱 安裝本節中使用的範例

若要建立工作專案

  1. 開啟訊息存放區。 如需如何開啟訊息存放區的相關信息,請 參閱開啟訊息存放區

  2. 開啟訊息存放區中的 [工作] 資料夾。 如需詳細資訊, 請參閱 PR_IPM_TASK_ENTRYID (PidTagIpmTaskEntryId) 。

  3. 在 [工作] 資料夾上呼叫 IMAPIFolder::CreateMessage 方法,以建立新的工作專案。

  4. dispidTaskRecur 設定 (PidLidTaskRecurrence) 屬性,以及建立週期性工作所需的其他工作相關屬性。

  5. 儲存新的工作專案。

AddTask CreateOutlookItemsAddin 專案Tasks.cpp原始程式檔中的函式會示範這些步驟。 函AddTask式會從 [新增工作] 對話框中取得參數,當您在 MFCMAPI 範例應用程式的 [載入宏] 功能表上按兩下 [新增工作] 時,就會顯示這些參數。 DisplayAddTaskDialogTasks.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;
}

另請參閱