代码之家  ›  专栏  ›  技术社区  ›  Kira

在非默认文件夹上捕获ItemAdd事件

  •  0
  • Kira  · 技术社区  · 10 年前

    我正在编写一个捕获某些Outlook事件的应用程序,我想为每个帐户捕获sentMail文件夹上的ItemAdd事件,对于Outlook2007(所有帐户只有一个已发送邮件文件夹),我使用以下代码。我必须执行哪些更改才能使其与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();
    }
    
    1 回复  |  直到 10 年前
        1
  •  0
  •   Dmitry Streblechenko    10 年前

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