Compartilhar via


Criar um item de tarefa simples de recorrência

Aplica-se a: Outlook 2013 | Outlook 2016

O MAPI pode ser usado para criar itens de tarefa. Este tópico descreve como criar um simples item de tarefa recorrente.

Para obter informações sobre como baixar, exibir e executar o código do aplicativo MFCMAPI e do projeto CreateOutlookItemsAddin referenciado neste tópico, consulte Instalar os exemplos usados nesta seção.

Para criar um item de tarefa

  1. Abra um repositório de mensagens. Para obter informações sobre como abrir um repositório de mensagens, consulte Abrir um Repositório de Mensagens.

  2. Abra a pasta Tarefas no repositório de mensagens. Para obter mais informações, consulte PR_IPM_TASK_ENTRYID (PidTagIpmTaskEntryId).

  3. Chame o método IMAPIFolder::CreateMessage na pasta Tarefas para criar o novo item de tarefa.

  4. Defina a propriedade dispidTaskRecur (PidLidTaskRecurrence) e outras propriedades relacionadas à tarefa necessárias para criar uma tarefa recorrente.

  5. Salve o novo item de tarefa.

A AddTask função no arquivo de origem Tasks.cpp do projeto CreateOutlookItemsAddin demonstra essas etapas. A AddTask função usa parâmetros da caixa de diálogo Adicionar Tarefa exibida quando você clica em Adicionar Tarefa no menu Addins no aplicativo de exemplo MFCMAPI. A DisplayAddTaskDialog função em Tasks.cpp exibe a caixa de diálogo e passa valores da caixa de diálogo para a AddTask função. A DisplayAddTaskDialog função não se relaciona diretamente com a criação de um item de tarefa usando MAPI, portanto, ela não está listada aqui.

Importante

O código no aplicativo MFCMAPI não garante que a pasta Tarefas tenha sido selecionada quando você clicar no comando Adicionar Tarefa no menu Addins . A criação de itens de tarefa em uma pasta diferente da pasta Tarefas pode causar um comportamento indefinido. Verifique se você selecionou a pasta Tarefas antes de usar o comando Adicionar Tarefa no aplicativo MFCMAPI.

A AddTask função está listada abaixo. Observe que o parâmetro lpFolder passado para a AddTask função é um ponteiro para uma interface IMAPIFolder que representa a pasta em que a nova tarefa é criada. Dado o lpFolder que representa uma interface IMAPIFolder , o código chama o método IMAPIFolder::CreateMessage . O método CreateMessage retorna um código de sucesso e um ponteiro para um ponteiro para uma interface IMessage . A maior parte do AddTask código de função manipula o trabalho de especificar propriedades em preparação para chamar o método IMAPIProp::SetProps . Se a chamada para o método SetProps for bem-sucedida, o método IMAPIProp::SaveChanges será chamado para confirmar as alterações no repositório e criar um novo item de tarefa.

A AddTask função define várias propriedades nomeadas. Para obter informações sobre propriedades nomeadas e como elas são criadas, consulte Usando MAPI para criar itens do Outlook 2007. Como as propriedades nomeadas usadas para itens de tarefa ocupam vários conjuntos de propriedades, deve-se tomar cuidado ao criar parâmetros para passar para o método IMAPIProp::GetIDsFromNames .

A AddTask função usa a BuildWeeklyTaskRecurrencePattern função auxiliar para criar uma estrutura que representa uma recorrência de tarefa para definir a propriedade dispidTaskRecur . Para obter informações sobre a estrutura de recorrência de tarefa que a BuildWeeklyTaskRecurrencePattern função cria, consulte Propriedade Canônica PidLidTaskRecurrence e Propriedade Canônica PidLidRecurrencePattern.

Observe que, embora uma grande variedade de padrões de recorrência seja possível, a BuildWeeklyTaskRecurrencePattern função só cria um padrão de recorrência semanal. Também é difícil codificar para uma série de suposições, como o tipo de calendário (gregoriano), o primeiro dia da semana (domingo) e o número de instâncias modificadas ou excluídas (nenhuma). Uma função de criação de padrão de recorrência de uso mais geral precisaria aceitar esses tipos de variáveis como parâmetros.

A seguir está a listagem completa da AddTask função.

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

Confira também