次の方法で共有


単純な定期的作業アイテムを作成する

適用対象: 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 サンプル アプリケーションの [アドイン] メニューの [タスク追加] をクリックしたときに表示される [タスクの追加] ダイアログ ボックスからパラメーターを受け取ります。 Tasks.cppの関数は DisplayAddTaskDialog 、ダイアログ ボックスを表示し、ダイアログ ボックスから関数に値を AddTask 渡します。 この関数は DisplayAddTaskDialog MAPI を使用したタスク項目の作成とは直接関係しないため、ここには表示されません。

重要

MFCMAPI アプリケーションのコードでは、[Addins] メニューの [タスクの追加] コマンドをクリックしたときに[タスク] フォルダーが選択されていることを確認できません。 タスク フォルダー以外のフォルダーにタスク 項目を作成すると、未定義の動作が発生する可能性があります。 MFCMAPI アプリケーションで [タスク追加] コマンドを使用する前に、[タスク] フォルダーが選択されていることを確認します。

関数を AddTask 次に示します。 関数に渡される AddTasklpFolder パラメーターは、新しいタスクが作成されるフォルダーを表す IMAPIFolder インターフェイスへのポインターであることに注意してください。 IMAPIFolder インターフェイスを表す lpFolder を指定すると、このコードは IMAPIFolder::CreateMessage メソッドを呼び出します。 CreateMessage メソッドは、成功コードと IMessage インターフェイスへのポインターへのポインターを返します。 ほとんどの関数コードは、AddTaskIMAPIProp::SetProps メソッドを呼び出すための準備でプロパティを指定する作業を処理します。 SetProps メソッドの呼び出しが成功すると、IMAPIProp::SaveChanges メソッドが呼び出され、ストアに変更がコミットされ、新しいタスク 項目が作成されます。

関数は AddTask 、名前付きプロパティの数を設定します。 名前付きプロパティとその作成方法については、「 MAPI を使用して Outlook 2007 アイテムを作成する」を参照してください。 タスク項目に使用される名前付きプロパティは複数のプロパティ セットを占有するため、 IMAPIProp::GetIDsFromNames メソッドに渡すパラメーターを構築するときは注意が必要です。

関数は AddTask 、ヘルパー関数を BuildWeeklyTaskRecurrencePattern 使用して 、dispidTaskRecur プロパティを設定するためのタスクの繰り返しを表す構造体を構築します。 関数がビルドするタスクの繰り返し構造 BuildWeeklyTaskRecurrencePattern の詳細については、「 PidLidTaskRecurrence 標準プロパティ 」および 「PidLidRecurrencePattern 標準プロパティ」を参照してください。

さまざまな繰り返しパターンが可能ですが、関数は週単位の 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;
}

関連項目