単純な定期的作業アイテムを作成する
適用対象: Outlook 2013 | Outlook 2016
MAPI を使用してタスク項目を作成できます。 このトピックでは、単純な繰り返しタスク 項目を作成する方法について説明します。
このトピックで参照されている MFCMAPI アプリケーションと CreateOutlookItemsAddin プロジェクトからコードをダウンロード、表示、実行する方法については、「 このセクションで使用するサンプルをインストールする」を参照してください。
タスク アイテムを作成するには
メッセージ ストアを開きます。 メッセージ ストアを開く方法については、「メッセージ ストア を開く」を参照してください。
メッセージ ストアの [タスク] フォルダーを開きます。 詳細については、「 PR_IPM_TASK_ENTRYID (PidTagIpmTaskEntryId)」を参照してください。
[タスク] フォルダーで IMAPIFolder::CreateMessage メソッドを呼び出して、新しいタスク 項目を作成します。
dispidTaskRecur (PidLidTaskRecurrence) プロパティと、繰り返しタスクを作成するために必要なその他のタスク関連プロパティを設定します。
新しいタスク 項目を保存します。
AddTask
CreateOutlookItemsAddin プロジェクトのTasks.cpp ソース ファイル内の関数は、次の手順を示しています。 関数はAddTask
、MFCMAPI サンプル アプリケーションの [アドイン] メニューの [タスクの追加] をクリックしたときに表示される [タスクの追加] ダイアログ ボックスからパラメーターを受け取ります。 Tasks.cppの関数は DisplayAddTaskDialog
、ダイアログ ボックスを表示し、ダイアログ ボックスから関数に値を AddTask
渡します。 この関数は DisplayAddTaskDialog
MAPI を使用したタスク項目の作成とは直接関係しないため、ここには表示されません。
重要
MFCMAPI アプリケーションのコードでは、[Addins] メニューの [タスクの追加] コマンドをクリックしたときに[タスク] フォルダーが選択されていることを確認できません。 タスク フォルダー以外のフォルダーにタスク 項目を作成すると、未定義の動作が発生する可能性があります。 MFCMAPI アプリケーションで [タスク の 追加] コマンドを使用する前に、[タスク] フォルダーが選択されていることを確認します。
関数を AddTask
次に示します。 関数に渡される AddTask
lpFolder パラメーターは、新しいタスクが作成されるフォルダーを表す IMAPIFolder インターフェイスへのポインターであることに注意してください。
IMAPIFolder インターフェイスを表す lpFolder を指定すると、このコードは IMAPIFolder::CreateMessage メソッドを呼び出します。
CreateMessage メソッドは、成功コードと IMessage インターフェイスへのポインターへのポインターを返します。 ほとんどの関数コードは、AddTask
IMAPIProp::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;
}