描述:
各位:
我有一个关于MFC 创建的DLL,这个DLL通过MFC Typelib的方式加入了一个OCX,我的OCX包括方法和事件2部分
现在的DLL中已经有了方法和事件的2个.h文件,里面定义了OCX的方法接口和event接口,方法接口直接在DLL中调用即可以
现在我的疑问是:
我需要通过怎么样的形式去使用OCX的event接口了,因为我调用ocx的方法接口后,需要通过判断相应的事件接口是否触发来做下一步的处理..我怎么在DLL中去绑定这个事件了,我也查阅了一些资料,说是用事件绑定,没看太明白,热心的朋友贴了些代码,但小弟是新手,对COM这些都不了解,哪位大哥可以帮我写个绑定事件的类,帮我解释一下了?我可以提供OCX的IDL文件或者用TypeLib方法生成的ocx的.h文件。再贴一位热心朋友给的示范代码,小弟愚笨,没看太明白,希望各位朋友可以解释下。
code:
//EventSink.h
#import "..\Server\Debug\Server.exe" raw_interface_only,no_namespace,named_guids
class CEventSink :
public IDispEventImpl <0, CEventSink,&DIID__IObjEvents,&LIBID_SERVERLib, 1, 0> //这个类的传入参数是什么意思了?
{
public:
CEventSink()
{
}
public:
BEGIN_SINK_MAP(CEventSink)
SINK_ENTRY_EX(0, DIID__IObjEvents, 1, cbFunc01) //这里的参数又是什么意思了?
END_SINK_MAP()
STDMETHOD(cbFunc01)();
};
//EventSink.cpp
#include "stdafx.h"
#include "EventSink.h"
STDMETHODIMP CEventSink::cbFunc01() //还有这个函数
{
AfxMessageBox("called by Event from dll Server !");
return S_OK;
}
// ClientDlg.cpp : implementation file
//
#include "EventSink.h"
void CClientDlg::OnButton1()
{
// TODO: Add your control notification handler code here
::CoInitialize(NULL);
{
IObjPtr pObj;
CEventSink *pEventSink= new CEventSink;
pObj.CreateInstance(__uuidof(Obj));
pEventSink->DispEventAdvise(pObj);
pObj->Func01();
pEventSink->DispEventUnadvise(pObj);
delete pEventSink;
}
::CoUninitialize();
}
期待热心朋友可以给上面这个代码加点注释,呵呵,万分感激!100分不多,如果可以帮助我解决,我可以再加分的!
解决方案1:
http://www.pcppc.cn/kaifa/VCjiaocheng/kaifa_115699.html
解决方案2:1楼给的是ATL的做法,在MFC中不适用,MFC有没有简单方法我不太清楚,但自己可以从IDispatch派生一个类,实现它的所有7个方法,然后通过组件查询IConnectPointContainer接口再寻找IConnectPoint接口,然后把派生类的实例指针Advise到连接点上即可。
解决方案3: 自己实现一个连接点对象类似的,继承与 IDispEventImpl ,因而需要传入一些你的信息作为参数等来实现
SINK_ENTRY_EX(0, DIID__IObjEvents, 1, cbFunc01) //绑定事件和对应的函数
STDMETHODIMP CEventSink::cbFunc01() //就是你希望回调的函数