近来学习 com技术,觉得可连接对象实现起来很难.经过拜读潘老师的书籍,用ATL写出了一个简单例子:
一 com组件方:
声明要实现的可连接对象
[
uuid(87EA0963-F479-4ABC-95DD-DF0F081B73D2),
helpstring("LJ Class")
]
interface _IWLEvents:IUnknown
{
[ helpstring("method tongku")] HRESULT JINGJING();
};
在类中声明
coclass LJ
{
[default] interface ILJ;
[source] interface _IWLEvents;
};
下一步用ATL生成可连接对象,ATL自动生成了 函数JINGJING 的激活方式,如下所示:
class CProxy_IWLEvents : public IConnectionPointImpl<T, &IID__IWLEvents, CComDynamicUnkArray>
{
//Warning this class may be recreated by the wizard.
public:
HRESULT Fire_JINGJING()
{
HRESULT ret;
T* pT = static_cast<T*>(this);
int nConnectionIndex;
int nConnections = m_vec.GetSize();
//遍历所以连接上来的客户端
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
_IWLEvents* p_IWLEvents = reinterpret_cast<_IWLEvents*>(sp.p);
if (p_IWLEvents != NULL)
ret = p_IWLEvents->JINGJING(); //调用客户端程序,和客户端发生关联
} return ret;
}
};
二 客户端
在客户端用一个对话框程序实现,首先要实现接口IWLEvents的类
class CIWL:public _IWLEvents
{
STDMETHODIMP QueryInterface (REFIID iid,LPVOID *pp)
{
*pp =this;
return S_OK;
}
STDMETHODIMP_(ULONG) AddRef()
{
return 2;
}
STDMETHODIMP_(ULONG) Release ()
{
return 1;
}
STDMETHODIMP JINGJING()
{
AfxMessageBox(“返回到客户端“);
return 1;
}
};
用一个button事件实现调用过程:
void CShowDlg::OnButton1()
{
CoInitialize(NULL);
ILJ * p;
IConnectionPointContainer * pContainer=NULL;
IConnectionPoint *pPoint = NULL;
HRESULT hr = CoCreateInstance(CLSID_LJ,NULL,CLSCTX_INPROC_SERVER , IID_ILJ,(void**)&p );
if(SUCCEEDED(hr))
{
p->QueryInterface(IID_IConnectionPointContainer,(void**)&pContainer);
if(SUCCEEDED(hr))
{
hr = pContainer->FindConnectionPoint(IID__IWLEvents, &pPoint);
if(SUCCEEDED(hr))
{
DWORD dwCookie;
CIWL * m_pDuckInt = new CIWL ;
hr =pPoint->Advise(m_pDuckInt,&dwCookie);
if(SUCCEEDED(hr))
{
p-> Fire() ;
pPoint->Release();
}
pPoint->Unadvise(dwCookie);
}
CoUninitialize();
}
本人是新手,希望各位老鸟们多多指教阿