我来谈一下吧! 一、先谈概念 incoming interface(引入接口) 一般是由组件自己实现的,用于接收客户的调用。 outgoing interface(引出接口) 一般是由客户实现的,由组件使用来向客户发送通知。但是组件和客户只是一个相对的概念。组件也可以同时是客户,它也可能需要事件通知。同时,如果客户对外提供服务的话,它也可以是组件。二、解决思路 ygang76 (小草) 的目的很清楚,是想实现已知的引出接口,作为客户以接收事件信息。 引出接口是定义在别人的类型库里的或提供给你的.h、_i.c里的,你必须知道确切的接口定义,否则你无法接收事件通知。事件接口多半是IDispatch接口,以兼容于VB这样的语言工具。1、C++ 你的程序应该是一个连接点客户程序,用ATL框架实现事件接口。 2、VB Dim WithEvents youObj As serverLib.IXXX private Sub youObj_IMethod(...) ... End Sub
你看ATL中实现不连接点的代码
CComVariant varResult;
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();
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
VariantClear(&varResult);
DISPPARAMS disp = { NULL, NULL, 0, 0 };
pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
}
}
return varResult.scode;
一、先谈概念
incoming interface(引入接口) 一般是由组件自己实现的,用于接收客户的调用。
outgoing interface(引出接口) 一般是由客户实现的,由组件使用来向客户发送通知。但是组件和客户只是一个相对的概念。组件也可以同时是客户,它也可能需要事件通知。同时,如果客户对外提供服务的话,它也可以是组件。二、解决思路
ygang76 (小草) 的目的很清楚,是想实现已知的引出接口,作为客户以接收事件信息。
引出接口是定义在别人的类型库里的或提供给你的.h、_i.c里的,你必须知道确切的接口定义,否则你无法接收事件通知。事件接口多半是IDispatch接口,以兼容于VB这样的语言工具。1、C++
你的程序应该是一个连接点客户程序,用ATL框架实现事件接口。
2、VB
Dim WithEvents youObj As serverLib.IXXX private Sub youObj_IMethod(...)
...
End Sub
其實在用IDispatch實現出接口時,客戶和服務器的概念已經很模糊,客戶其實也可以稱做服務器。因為服務器端觸發事件時是調用的IDispatch接口,這不是正好也反過來了嗎。客戶端此時也可以叫做服務器端,服務器端此時也可叫做客戶端。對於這個問題,我已經找到解決方案。謝謝大家的參與,但由於大家的回答都不是很符合我的意思,所以隻能酌情給分了,謝謝大家!!!