Crear un elemento de tarea periódica simple
Hace referencia a: Outlook 2013 | Outlook 2016
MAPI se puede usar para crear elementos de tarea. En este tema se describe cómo crear un elemento de tarea recurrente simple.
Para obtener información sobre cómo descargar, ver y ejecutar el código desde la aplicación MFCMAPI y el proyecto CreateOutlookItemsAddin al que se hace referencia en este tema, vea Instalar los ejemplos usados en esta sección.
Para crear un elemento de tarea
Abra un almacén de mensajes. Para obtener información sobre cómo abrir un almacén de mensajes, consulte Apertura de un almacén de mensajes.
Abra la carpeta Tareas en el almacén de mensajes. Para obtener más información, vea PR_IPM_TASK_ENTRYID (PidTagIpmTaskEntryId).
Llame al método IMAPIFolder::CreateMessage en la carpeta Tasks para crear el nuevo elemento de tarea.
Establezca la propiedad dispidTaskRecur (PidLidTaskRecurrence) y otras propiedades relacionadas con la tarea necesarias para crear una tarea recurrente.
Guarde el nuevo elemento de tarea.
La AddTask
función del archivo de origen Tasks.cpp del proyecto CreateOutlookItemsAddin muestra estos pasos. La AddTask
función toma parámetros del cuadro de diálogo Agregar tarea que se muestra al hacer clic en Agregar tarea en el menú Complementos de la aplicación de ejemplo MFCMAPI. La DisplayAddTaskDialog
función de Tasks.cpp muestra el cuadro de diálogo y pasa valores del cuadro de diálogo a la AddTask
función. La DisplayAddTaskDialog
función no se relaciona directamente con la creación de un elemento de tarea mediante MAPI, por lo que no aparece aquí.
Importante
El código de la aplicación MFCMAPI no garantiza que se haya seleccionado la carpeta Tareas al hacer clic en el comando Agregar tarea en el menú Complementos . La creación de elementos de tarea en una carpeta distinta de la carpeta Tareas puede provocar un comportamiento indefinido. Asegúrese de que ha seleccionado la carpeta Tareas antes de usar el comando Agregar tarea en la aplicación MFCMAPI.
La AddTask
función se muestra a continuación. Tenga en cuenta que el parámetro lpFolder pasado a la AddTask
función es un puntero a una interfaz IMAPIFolder que representa la carpeta donde se crea la nueva tarea. Dado el lpFolder que representa una interfaz IMAPIFolder , el código llama al método IMAPIFolder::CreateMessage . El método CreateMessage devuelve un código correcto y un puntero a un puntero a una interfaz IMessage . La mayoría del código de AddTask
función controla el trabajo de especificar propiedades como preparación para llamar al método IMAPIProp::SetProps . Si la llamada al método SetProps se realiza correctamente, se llama al método IMAPIProp::SaveChanges para confirmar los cambios en el almacén y crear un nuevo elemento de tarea.
La AddTask
función establece un número de propiedades con nombre. Para obtener información sobre las propiedades con nombre y cómo se crean, vea Uso de MAPI para crear elementos de Outlook 2007. Dado que las propiedades con nombre usadas para los elementos de tarea ocupan varios conjuntos de propiedades, se debe tener cuidado al compilar parámetros para pasar al método IMAPIProp::GetIDsFromNames .
La AddTask
función usa la BuildWeeklyTaskRecurrencePattern
función auxiliar para compilar una estructura que representa una periodicidad de tarea para establecer la propiedad dispidTaskRecur . Para obtener información sobre la estructura de periodicidad de tareas que compila la BuildWeeklyTaskRecurrencePattern
función, vea Propiedad canónica PidLidTaskRecurrence y Propiedad canónica PidLidRecurrencePattern.
Tenga en cuenta que, aunque es posible una gran variedad de patrones de periodicidad, la BuildWeeklyTaskRecurrencePattern
función solo crea un patrón de periodicidad semanal. También está codificado de forma rígida para una serie de suposiciones, como el tipo de calendario (gregoriano), el primer día de la semana (domingo) y el número de instancias modificadas o eliminadas (ninguna). Una función de creación de patrones de periodicidad de uso general tendría que aceptar este tipo de variables como parámetros.
A continuación se muestra la lista completa de la AddTask
función.
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;
}