【问题标题】:Capture ItemAdd event on a non-default folder在非默认文件夹上捕获 ItemAdd 事件
【发布时间】:2014-02-25 22:36:37
【问题描述】:

我正在编写一个捕获一些 Outlook 事件的应用程序,我想在每个帐户的 sentMail 文件夹上捕获 ItemAdd 事件,对于 Outlook 2007(所有帐户只有一个已发送邮件文件夹)我正在使用以下代码。我必须执行哪些更改才能使其与 Outlook 2010 一起使用(为所有帐户订阅事件)?任何帮助表示赞赏。

const IID IID_ItemsEvents = {0x00063077, 0x0000, 0x0000, {0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};

CComPtr<Outlook::_Application> spApplication;
hr = spApplication.CoCreateInstance(__uuidof(Outlook::Application), 0, CLSCTX_LOCAL_SERVER );

if(SUCCEEDED(hr) && spApplication)
{
    CComPtr<Outlook::_NameSpace> spSession;
    hr = spApplication->get_Session(reinterpret_cast<Outlook::_NameSpace **>(&spSession));

    if (SUCCEEDED(hr) && spSession)
    {

        CComPtr<Outlook::MAPIFolder> spSentMailsFolder;

        hr = spSession->GetDefaultFolder(Outlook::olFolderSentMail, &spSentMailsFolder);
        CComPtr<Outlook::_Items> spItems;
        spSentMailsFolder->get_Items(&spItems);

        if (SUCCEEDED(hr) && spItems)
        { 
            CComPtr<Outlook::ItemsEvents > spItem;
            CComPtr<IConnectionPointContainer> spContainer;

            HRESULT hr = spItems->QueryInterface(__uuidof(IConnectionPointContainer),reinterpret_cast<void **>(&spContainer));

            if (SUCCEEDED(hr))
            {   
                HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
                CComPtr<CItemsEventListener> spSink = new CItemsEventListener(hEvent);
                CComPtr<IConnectionPoint> spConnectionPoint;

                hr = spContainer->FindConnectionPoint(IID_ItemsEvents, &spConnectionPoint);

                if (SUCCEEDED(hr) && spConnectionPoint)
                {
                    DWORD dwCookie = 0;                                                             
                    hr = spConnectionPoint->Advise(spSink, &dwCookie);  

                    if (SUCCEEDED(hr))
                    {                                   
                        while(true)
                        {    
                            MSG Message;
                            while(PeekMessage(&Message, NULL, WM_NULL, WM_NULL, PM_REMOVE))
                            {
                                TranslateMessage(&Message);
                                DispatchMessage(&Message);
                            }   

                            DWORD dwStatus = WaitForSingleObject(hEvent, 0);
                            Sleep(1);
                        }

                        spConnectionPoint->Unadvise(dwCookie);                                  
                    }

                }
            }                                               

        }
        else
        {
            //m_LogTrace->WriteLine("\tERROR\tEchec de l'appel de la méthode get_Items");
        }
    }
    else
    {
        //m_LogTrace->WriteLine("\tERROR\tEchec de l'appel de la méthode get_Session");
    }

    spApplication.Release();
}

【问题讨论】:

    标签: c++ outlook outlook-2010


    【解决方案1】:

    Yu 需要将每个 Items 对象保存在一个列表/数组中,并为每个 Items 对象运行上面的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 2011-01-28
      相关资源
      最近更新 更多