Это моя текущая функция, которая является частью моей 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, а затем сделать вызов, чтобы удалить, как я пошел, я мог бы обновить мой индикатор выполнения ...