COM 组件设计与应用(十五)——连接点(vc6.0)

http://tech.ddvip.com   2006年07月22日    社区交流

本文详细介绍COM 组件设计与应用(十五)——连接点(vc6.0)

  四、实现调用者(一)

  1、建立一个 MFC 工程(Project)。示例程序中的工程名称叫 Use。

  2、按照咱们以前所学的知识,添加 #import、AfxOleInit()、......不多浪费口条了。如果你还不会,那么请重新从“第四回”再次阅读。 (注2)

  3、这里只介绍一下重点部分。我们需要在调用者工程中,增加“接收器”对象。还记得上回书中的增加“回调接收器”对象的方法吗?上回中,我们的回调接口是从 IUnknown 继承下来的。本回中,由于我们的组件是双接口(Dual)的,连接点也是双接口的,因此这次我们的接收器要从 IDispatch 派生啦。

  4、完成 CSink 类的接口函数(虚函数)

STDMETHODIMP CSink::QueryInterface(const struct _GUID &iid,void ** ppv)
{
  *ppv=this;
  return S_OK;
}
ULONG __stdcall CSink::AddRef(void)
{  return 1;  }  // 做个假的就可以,因为反正这个对象在程序结束前是不会退出的
ULONG __stdcall CSink::Release(void)
{  return 0;  }  // 做个假的就可以,因为反正这个对象在程序结束前是不会退出的
STDMETHODIMP CSink::GetTypeInfoCount(unsigned int *)
{  return E_NOTIMPL;  }  // 不用实现,反正也不用
STDMETHODIMP CSink::GetTypeInfo(unsigned int,unsigned long,struct ITypeInfo ** )
{  return E_NOTIMPL;  }  // 不用实现,反正也不用
STDMETHODIMP CSink::GetIDsOfNames(const struct _GUID &,unsigned short ** ,unsigned int,unsigned long,long *)
{  return E_NOTIMPL;  }  // 不用实现,反正也不用
STDMETHODIMP CSink::Invoke(
  long dispID,
  const struct _GUID &,
  unsigned long,
  unsigned short,
  struct tagDISPPARAMS * pParams,
  struct tagVARIANT *,
  struct tagEXCEPINFO *,
  unsigned int *)
{    // 只需要实现这个就足够啦
  switch(dispID)  // 根据不同的dispID,完成不同的回调函数
  {
  case 1:
    ......  // 这里就能接收到 COM 发出的事件啦
    break;
  case 2:
    ......  // 事件的代号 dispID 其实就是 IDL 文件中的连接点函数的id(n)的号码
    break;
  default:  break;
  }
  return S_OK;
}

  五、示例(二)

责编:豆豆技术应用

正在加载评论...