Freigeben über


Erstellen eines einfachen wiederkehrenden Aufgabenelements

Gilt für: Outlook 2013 | Outlook 2016

MAPI kann zum Erstellen von Aufgabenelementen verwendet werden. In diesem Thema wird beschrieben, wie Sie ein einfaches wiederkehrendes Aufgabenelement erstellen.

Informationen zum Herunterladen, Anzeigen und Ausführen des Codes aus der MFCMAPI-Anwendung und dem CreateOutlookItemsAddin-Projekt, auf das in diesem Thema verwiesen wird, finden Sie unter Installieren der in diesem Abschnitt verwendeten Beispiele.

So erstellen Sie ein Aufgabenelement

  1. Öffnen Sie einen Nachrichtenspeicher. Informationen zum Öffnen eines Nachrichtenspeichers finden Sie unter Öffnen eines Nachrichtenspeichers.

  2. Öffnen Sie den Ordner Tasks im Nachrichtenspeicher. Weitere Informationen finden Sie unter PR_IPM_TASK_ENTRYID (PidTagIpmTaskEntryId).

  3. Rufen Sie die IMAPIFolder::CreateMessage-Methode für den Ordner Tasks auf, um das neue Aufgabenelement zu erstellen.

  4. Legen Sie die Eigenschaft dispidTaskRecur (PidLidTaskRecurrence) und andere aufgabenbezogene Eigenschaften fest, die zum Erstellen einer wiederkehrenden Aufgabe erforderlich sind.

  5. Speichern Sie das neue Aufgabenelement.

Die AddTask Funktion in der Tasks.cpp Quelldatei des CreateOutlookItemsAddin-Projekts veranschaulicht diese Schritte. Die AddTask Funktion übernimmt Parameter aus dem Dialogfeld Aufgabe hinzufügen, das angezeigt wird, wenn Sie in der MFCMAPI-Beispielanwendung im Menü Addins auf Aufgabe hinzufügen klicken. Die DisplayAddTaskDialog Funktion in Tasks.cpp zeigt das Dialogfeld an und übergibt Werte aus dem Dialogfeld an die AddTask Funktion. Die DisplayAddTaskDialog Funktion bezieht sich nicht direkt auf das Erstellen eines Aufgabenelements mithilfe von MAPI, daher ist sie hier nicht aufgeführt.

Wichtig

Der Code in der MFCMAPI-Anwendung stellt nicht sicher, dass der Ordner Aufgaben ausgewählt wurde, wenn Sie im Menü Hinzufügen auf den Befehl Aufgabe hinzufügen klicken. Das Erstellen von Aufgabenelementen in einem anderen Ordner als dem Ordner Tasks kann zu undefiniertem Verhalten führen. Stellen Sie sicher, dass Sie den Ordner Tasks ausgewählt haben, bevor Sie den Befehl Aufgabe hinzufügen in der MFCMAPI-Anwendung verwenden.

Die AddTask Funktion ist unten aufgeführt. Beachten Sie, dass der lpFolder-Parameter , der an die AddTask Funktion übergeben wird, ein Zeiger auf eine IMAPIFolder-Schnittstelle ist, die den Ordner darstellt, in dem die neue Aufgabe erstellt wird. Angesichts des lpFolder-Elements , das eine IMAPIFolder-Schnittstelle darstellt, ruft der Code die IMAPIFolder::CreateMessage-Methode auf. Die CreateMessage-Methode gibt einen Erfolgscode und einen Zeiger auf einen Zeiger auf eine IMessage-Schnittstelle zurück. Der Großteil des AddTask Funktionscodes übernimmt die Angabe von Eigenschaften in Vorbereitung auf den Aufruf der IMAPIProp::SetProps-Methode . Wenn der Aufruf der SetProps-Methode erfolgreich ist, wird die IMAPIProp::SaveChanges-Methode aufgerufen, um die Änderungen an den Speicher zu committen und ein neues Aufgabenelement zu erstellen.

Die AddTask Funktion legt eine Reihe benannter Eigenschaften fest. Informationen zu benannten Eigenschaften und deren Erstellung finden Sie unter Verwenden von MAPI zum Erstellen von Outlook 2007-Elementen. Da die benannten Eigenschaften, die für Aufgabenelemente verwendet werden, mehrere Eigenschaftensätze belegen, muss beim Erstellen von Parametern, die an die IMAPIProp::GetIDsFromNames-Methode übergeben werden, vorsichtsbesorgt werden.

Die AddTask Funktion verwendet die BuildWeeklyTaskRecurrencePattern Hilfsfunktion, um eine Struktur zu erstellen, die eine Aufgabenserie zum Festlegen der dispidTaskRecur-Eigenschaft darstellt. Informationen zur Aufgabenserienstruktur, die die BuildWeeklyTaskRecurrencePattern Funktion erstellt, finden Sie unter Kanonische PidLidTaskRecurrence-Eigenschaft und Kanonische PidLidRecurrencePattern-Eigenschaft.

Beachten Sie, dass zwar eine Vielzahl von Wiederholungsmustern möglich ist, die BuildWeeklyTaskRecurrencePattern Funktion jedoch nur ein wöchentliches Wiederholungsmuster erstellt. Es ist auch hartcodiert für eine Reihe von Annahmen, z. B. den Kalendertyp (gregorianischen), den ersten Tag der Woche (Sonntag) und die Anzahl der geänderten oder gelöschten Instanzen (keine). Eine allgemeinere Serienmustererstellungsfunktion müsste diese Arten von Variablen als Parameter akzeptieren.

Im Folgenden finden Sie die vollständige Auflistung der AddTask Funktion.

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;
}

Siehe auch