捕获自动发现完成事件

Capturing AutoDiscoverComplete event

本文关键字:事件 发现      更新时间:2023-10-16

我使用以下代码来捕获帐户自动发现完成事件。运行捕获此事件的线程时,我收到访问冲突错误,QueryInterface 方法失败。问题可能出在哪里?

DWORD WINAPI CaptureAccountDiscovery(LPVOID param)
    {
        CoInitialize(NULL);
        CComPtr<Outlook::_Application> spApplication;
        HRESULT 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::_Accounts> spAccounts;
                hr = spSession->get_Accounts(reinterpret_cast<Outlook::_Accounts **>(&spAccounts));
                if (SUCCEEDED(hr) && spAccounts)
                {                                       
                    VARIANT index;
                    index.intVal = 1;
                    index.vt = VT_INT;
                    CComPtr<Outlook::_Accounts> spAccounts;
                    hr = spAccounts->Item(index, reinterpret_cast<Outlook::_Account **>(&spAccounts));
                    if (SUCCEEDED(hr) && spAccounts)
                    {                           
                        CComPtr<IConnectionPointContainer> spContainer;
                        HRESULT hr = spAccounts->QueryInterface(__uuidof(IConnectionPointContainer),reinterpret_cast<void **>(&spContainer));
                        if (SUCCEEDED(hr) && spContainer)
                        {   
                            HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
                            CComPtr<CAccountDiscover> spSink = new CAccountDiscover(hEvent);
                            CComPtr<IConnectionPoint> spConnectionPoint;
                            hr = spContainer->FindConnectionPoint(Outlook::CLSID_Accounts, &spConnectionPoint);
                            if (SUCCEEDED(hr) && spConnectionPoint)
                            {
                                DWORD dwCookie = 0;                             
                                CComPtr<IUnknown> spUnknown;
                                hr = spConnectionPoint->QueryInterface(IID_IUnknown, reinterpret_cast<void **>(&spUnknown));
                                if (SUCCEEDED(hr) && spUnknown)
                                {                                   
                                    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);                                  
                                    }
                                }
                            }
                        }                                               
                    }               
                }
            }
            spApplication.Release();
        }
        CoUninitialize();
    return 0;
    }

代码

CComPtr<Outlook::_Accounts> spAccounts;
hr = spAccounts->Item(index, reinterpret_cast<Outlook::_Account **>(&spAccounts));

真的需要

CComPtr<Outlook::_Account> spAccount;
hr = spAccounts->Item(index, &spAccount);

请注意单数而不是复数。