频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

COM 组件设计与应用(十六)——连接点(vc.net)

来源: 作者: 出处:巧巧读书 2007-10-09 进入讨论组

  示例程序中的第2个组件(MultConnect),我们再增加一个连接点( _IDispConnectEvents2 )。这个接口对象负责完成一个时钟,每间隔一定的豪秒就向调用者发出“时钟事件”。增加第二个连接点的方法是要手工修改 IDL 文件

......
library MultConnectLib
{
  importlib("stdole2.tlb");
  ...... // 第一个连接点。是 ATL 帮我们生成的
  [  // 第2个连接点,需要我们手工添加
    uuid(E3330AE1-2B1D-42E6-A8E0-A9CB0D1AC74C), // CLSID 可以用 GUIDGEN.EXE 产生
    helpstring("_IDispConnect事件接口")
  ]
  dispinterface _IDispConnectEvents2
  {
    properties:
    methods:
  };
  [
    uuid(4B0FDB44-BAF2-4F25-A2B0-B5ECD5CD440E), // 这是示例程序的类型库ID,肯定和你产生是不同的
    helpstring("DispConnect Class")
  ]
  coclass DispConnect
  {
    [default] interface IDispConnect;
    [default, source] dispinterface _IDispConnectEvents;
    [source] dispinterface _IDispConnectEvents2; // 别忘了,这还有一行
  };
};

  好了,和前面的方式一样,增加接口函数、让IDE帮我们实现代理类代码、输入程序代码、修改框架代码中的BUG。在示例中,我们的事件函数叫 HRESULT Timer([in] VARIANT varData),varData 中传递一个时间类型(VT_DATA)的信息(注3)。下面我们来看一下代理类代码中的错误:

HRESULT Fire_Timer( VARIANT varDate)
{
  HRESULT hr = S_OK;
  T * pThis = static_cast(this);
  int cConnections = m_vec.GetSize();
  for (int iConnection = 0; iConnection < cConnections; iConnection++)
  {
    pThis->Lock();
    CComPtr punkConnection = m_vec.GetAt(iConnection);
    pThis->Unlock();
    IDispatch * pConnection = static_cast(punkConnection.p);
    if (pConnection)
    {
      CComVariant avarParams[1];
      // 原始为:avarParams[0] = varDate;  avarParams[0].vt = VT_VARIANT;
     // 但可惜这是错误的,因为 avarParams[0] = varDate; 就已经正确地完成了赋值
     // 再对 avarParams[0].vt 赋值,是引用方式才能这么操作的。
     avarParams[0] = varDate; // 这才是正确的操作
      CComVariant varResult;
      DISPPARAMS params = { avarParams, NULL, 1, 0 };
      hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL);
     }
  }
  return hr;
}

  在编写调用者客户端代码方面,如果你需要接收时钟事件,那么可以仿照示例一再从 IDispatch 派生一个时钟接收器。大家下载事例程序代码,里面有丰富的注释信息。

更多文章 更多内容请看.NET移动与嵌入式技术.NET开发手册.NET应用研究专题,或进入讨论组讨论。
更多专题 【深 度 阅 读】 相 关 文 章
    收藏此文】【 】【打印】【关闭
    相关图文阅读
    频道图文推荐
    健 康 咨 询
    时 尚 咨 询
    巧巧读书宗旨
    相关专题
    讨论组问题推荐
    站内各频道最新更新文档
    站内最新制作专题
    热门关键字导读
    Photoshop教 程照片处理 照片制作 PS快捷键 抠图
    计 算 机 故 障XP系统修复
    艺 术 与 设 计设计 流媒体 设计欣赏 边框
    计 算 机 安 全ARP
    站内频道文章精选
    巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章