Возврат Outlook.Items из DLL в MFC, а затем итерации элементов в MFC - PullRequest
0 голосов
/ 07 мая 2019

Это моя текущая функция, которая является частью моей C # DLL, которая использует взаимодействие с Outlook:

public long PurgePTSCalendar(bool bPurgeAll)
{
    long lCount = 0;
    int iLastPercent = 0;

    if (!IsValid())
        return 0;

    try
    {
        // Get the MAPI namespace object (not sure exactly what this is)
        Outlook.NameSpace oMAPI = _OutlookApp.GetNamespace("MAPI");
        if (oMAPI == null)
            return 0;

        // Now get the default Outlook calendar folder
        Outlook.MAPIFolder oFolder = oMAPI.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
        if (oFolder == null)
            return 0;

        // Ensure it is a calendar folder.  This test is not strictly required.
        if (oFolder.DefaultItemType != Outlook.OlItemType.olAppointmentItem)
            return 0;

        // Get the collect of items from the calendar folder
        Outlook.Items oFolderItems = oFolder.Items;
        if (oFolderItems == null)
            return 0;

        Outlook.Items oItemsToPurge = null;

        // Do we want to purge all entries?
        if (bPurgeAll)
        {
            // Yes, purge all.
            oItemsToPurge = oFolderItems;
        }
        else
        {
            // No, we only want to purge records from today onwards
            // We must get a restricted list
            oFolderItems.Sort("Start");

            // Filter from today onwards (not any start / end 
            // date from a meeting or other item).
            String strStartDate = DateTime.Now.Date.ToShortDateString();
            string strFilter = "[Start] >=\"" + strStartDate + " 12:00 AM\"";
            oItemsToPurge = oFolderItems.Restrict(strFilter);
        }

        if (oItemsToPurge == null)
            return lCount;

        int iNumItems = oItemsToPurge.Count;

        for (int iItem = iNumItems; iItem >= 1; iItem--)
        {
            object oItem = oItemsToPurge[iItem];
            Outlook.AppointmentItem oEvent = (oItem as Outlook.AppointmentItem);

            int iPercent = ((iNumItems - iItem) + 1) * 100 / iNumItems;
            if (iPercent >= iLastPercent + 5 || iPercent == 100)
            {
                iLastPercent = iPercent;
                // Do Progress
            }

            if (oEvent != null)
            {
                // Get category for this item
                string strCat = oEvent.Categories;

                // Can we delete it?
                if (strCat == "xxx")
                {
                    oEvent.Delete();
                    lCount++;
                }
                Marshal.ReleaseComObject(oEvent);
            }
            Marshal.ReleaseComObject(oItem);
        }
        Marshal.ReleaseComObject(oItemsToPurge);
        Marshal.ReleaseComObject(oFolderItems);
        Marshal.ReleaseComObject(oFolder);
        Marshal.ReleaseComObject(oMAPI);
    }
    catch (Exception e)
    {
        MessageBox.Show(e.ToString());
    }

    return lCount;
}

Он вызывается в моем исполняемом файле MFC следующим образом:

long COutlookManagerEx::PurgePTSCalendar(bool bPurgeAll)
{
    __int64 lCount = 0;

    if (IsValid())
    {
        VARIANT_BOOL vbPurgeAll = VARIANT_FALSE;
        if (bPurgeAll)
            vbPurgeAll = VARIANT_TRUE;

        throw_if_fail(m_pInterface->PurgePTSCalendar(vbPurgeAll, &lCount));
    }

    return static_cast<long>(lCount);
}

Работает без проблем. Просто ему не хватает мониторинга прогресса . Я пытался понять (через другой вопрос , который я задал) об обновлении индикатора выполнения в моем CDialog из DLL , но я не понимаю инструкции, которые я прочитал в ссылках в ответе печально.

В результате я пытаюсь упростить вещи. Может ли моя DLL вернуть объект oItemsToPurge? И затем из MFC мы зациклим этот объект и выполним удаление оттуда?

Если бы я мог повторить список из MFC, а затем сделать вызов, чтобы удалить, как я пошел, я мог бы обновить мой индикатор выполнения ...

...