繁体   English   中英

非MFC替代mingw中Microsoft COM对象的AfxConnectionAdvise

[英]Non-MFC replacement for the AfxConnectionAdvise for Microsoft COM objects in mingw

我正在尝试实现DDiskFormat2DataEvents类,以侦听IDiskFormat2Data的进度事件。 我发现连接这两个的唯一示例使用AfxConnectionAdvise。 该项目内置于mingw64中,因此我需要找到该MFC方法的替代方法,或者如何手动连接com对象的源和接收器。 任何的意见都将会有帮助。 谢谢

这是一个非常简单的连接点实现。 我发现了这一点 (德语链接,但是代码非常简单)-但是需要进行错误检查。

大多数工作是使用ITypeInfo设置IDispatch实现。 您可以直接实现GetIDsOfNames和Invoke(无需使用ITypeInfo),但是我发现将ITypeInfo与事件接口一起使用会更简单(因为已经构建了typeinfo)。

您可能还希望查看该问题的答案。

// pConnectTo = IDiscFormat2Data-Interface 
// riid = IID_DDiscFormat2DataEvents 
// pUnknown = The Event Receiver ( see below)
void connect(IUnknown* pConnectTo, REFIID riid, IUnknown* pUnknown) 
{ 
// QI the container
 HRESULT hr = pConnectTo->QueryInterface(IID_IConnectionPointContainer, (void**)&m_connContainer); 

// Find the connection point:
 hr = m_connContainer->FindConnectionPoint(riid, &m_connPoint); 

// Set up advice link
 DWORD cookie; 
 hr = m_connPoint->Advise(pUnknown, &cookie); 

// Retain the cookie:
 m_dwCookie = cookie; 
} 


// The Event Receiver (implicitly derives from IDispatch): 
class EventReceiver : public DDiscFormat2DataEvents 
{ 
public: 
    EventReceiver();
    virtual HRESULT __stdcall Update(IDispatch* object, IDispatch* progress); 
private:
    com_ptr_t<ITypeInfo> m_ptinfo;
};

EventReceiver::EventReceiver()
{
    m_ptinfo = NULL; 

    HRESULT hr = 0; 
    LPTYPELIB ptlib = NULL; 

    hr = LoadRegTypeLib(LIBID_IMAPILib2, IMAPILib2_MajorVersion, IMAPILib2_MinorVersion, LOCALE_SYSTEM_DEFAULT, &ptlib)); 

    if (!FAILED(hr))
    { 
        hr = ptlib->GetTypeInfoOfGuid(IID_DDiscFormat2DataEvents, &m_ptinfo)); 
        ptlib->Release(); 
    }
}

// boilerplate IDispatch implementation based on Typeinfo
STDMETHODIMP EventReceiver::GetTypeInfoCount(UINT FAR *pctinfo) 
{ 
     *pctinfo = 1; 

     return NOERROR; 
} 

 STDMETHODIMP EventReceiver::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo FAR * FAR *pptinfo) 
{ 
     *pptinfo = NULL; 

     if (itinfo != 0) return ResultFromScode(DISP_E_BADINDEX); 

     m_ptinfo->AddRef(); 

     *pptinfo = m_ptinfo; 

     return NOERROR; 
} 

 STDMETHODIMP EventReceiver::GetIDsOfNames(REFIID riid, OLECHAR FAR * FAR *rgszNames, UINT cNames, LCID lcid, DISPID FAR *rgdispid) 
{ 
     return DispGetIDsOfNames(m_ptinfo, rgszNames, cNames, rgdispid); 
} 

 STDMETHODIMP EventReceiver::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, EXCEPINFO FAR *pexcepinfo, UINT FAR *puArgErr) 
{ 
     return DispInvoke(this, m_ptinfo, dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM