关闭

组件对象模型与ATL实现补遗

2351人阅读 评论(2) 收藏 举报

组件对象模型与ATL实现补遗

cheungmine

2007-10-11

        组件对象模型与ATL实现文章写好了,但是遗漏了一个关键问题。就是还有一个需要修改atlcom.h文件的地方,我把它更正在这里。打开按上篇文章改正后的atlcom0.h,找到下面的函数:

STDMETHODIMP IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Next

更正为(只需要改变粗体的地方,一句话而已 )

hr = Copy::copy(pelt, &*m_iter);

改为


hr = Copy::copy(pelt, *m_iter); 

改过之后的完整的函数如下:

template <class Base, const IID* piid, class T, class Copy, class CollType>
STDMETHODIMP IEnumOnSTLImpl
<Base, piid, T, Copy, CollType>::Next(ULONG celt, T* rgelt,
    ULONG
* pceltFetched)
{
    
if (rgelt == NULL || (celt != 1 && pceltFetched == NULL))
        
return E_POINTER;
    
if (pceltFetched != NULL)
        
*pceltFetched = 0;
    
if (m_pcollection == NULL)
        
return E_FAIL;

    ULONG nActual 
= 0;
    HRESULT hr 
= S_OK;
    T
* pelt = rgelt;
    
while (SUCCEEDED(hr) && m_iter != m_pcollection->end() && nActual < celt)
    {
        
// hr = Copy::copy(pelt, &*m_iter);
        hr = Copy::copy(pelt, *m_iter);    // CHEUNGMINE
        if (FAILED(hr))
        {
            
while (rgelt < pelt)
                Copy::destroy(rgelt
++);
            nActual 
= 0;
        }
        
else
        {
            pelt
++;
            m_iter
++;
            nActual
++;
        }
    }
    
if (SUCCEEDED(hr))
    {
        
if (pceltFetched)
            
*pceltFetched = nActual;
        
if (nActual < celt)
            hr 
= S_FALSE;
    }
    
return hr;
}

 

        如果还有任何问题,请参考我的示例代码。

http://download.csdn.net/source/260939

 

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

组件对象模型与ATL实现

应朋友之托,写这篇文章。 cheungmine 2007-10-10   本文所讲解的构建COM对象模型的技术主要面向对COM开发有一定经验却又难领悟其精髓的人,也许在高手看来,本文不过是东搬...
  • yanjinrong
  • yanjinrong
  • 2013-12-09 02:00
  • 542

VS2010 简单ATL COM开发(上)

1、打开VS2010,新建ATL COM 项目,步骤:“文件” --》“新建” --》“项目”,选择“Visual C++” --》“ATL 项目” ,填写“名称” FirstCOM --》“确定”。...
  • wangwenjing90
  • wangwenjing90
  • 2013-04-08 14:03
  • 17684

[COM/ATL]组件、对象、MFC、ATL的区别

组件(Component)和对象(Object)之间的区别 先明确组件(Component)和对象(Object)之间的区别。组件是一个可重用的模块,它是由一 组处理过程、数据封装和用户接口组成的业...
  • ouyangshima
  • ouyangshima
  • 2013-07-19 19:58
  • 1537

VS2010创建ATL工程及使用C++测试COM组件

1.创建ATL项目,取名MyCom 2. ATL 项目向导,勾选 【支持COM+ 1.0】和【支持部件注册器】,其他默认,点击完成。 3.在该项目中添加类 4.添加一个ATL简单对象...
  • xiaojun111111
  • xiaojun111111
  • 2015-03-30 12:17
  • 805

创建ATL工程及使用C++测试COM组件

VS2010创建ATL工程及使用C++测试COM组件              1.创建ATL项目,取名MyCom 2. ATL 项目向导,勾选 ...
  • jiangqin115
  • jiangqin115
  • 2015-09-08 09:31
  • 769

COM组件(ATL篇)

目 录 第1章 创建进程内组件    1 1.1 目标    1 1.2 创建项目    3 1.2.1 VC++6.0...
  • Hanford
  • Hanford
  • 2016-11-25 21:45
  • 1082

20.ATL中实现可连接对象和接收器

可连接对象是COM中观察者模式实现,非常有用,特别和IE组件打交道时候要用到。本文使用ATL实现可连接对象和对应的接收器,提供完整代码实现,可对比学习。
  • wenzhou1219
  • wenzhou1219
  • 2016-08-08 09:35
  • 849

ATL--创建简单的ATL之dll工程,添加“ATL简单对象”类的参数说明

添加“ATL简单对象”类一共分三个步骤 1.添加名称 2.文件类型选项 3.参数选项 添加接口 1.鼠标右键工程添加类 2.类型选择“ATL简单对象” 3.就在简...
  • sakawa_x
  • sakawa_x
  • 2017-07-21 16:26
  • 272

COM组件开发(六)——使用ATL开发COM组件

使用ATL开发COM组件           使用ATL开发COM组件之前,要对几个重要的类进行说明:         ...
  • q5806622
  • q5806622
  • 2015-02-27 10:10
  • 2223

用ATL创建COM组件详细解说

用ATL创建COM组件详细解说 服务器interfacemicrosoftlibrarybasicobject 一、创建一个模型(工程) MyProj。 二、给模型(工程)增加一个组...
  • jolin678
  • jolin678
  • 2015-09-23 11:22
  • 526
    个人资料
    • 访问:1434929次
    • 积分:18234
    • 等级:
    • 排名:第597名
    • 原创:295篇
    • 转载:9篇
    • 译文:16篇
    • 评论:1240条
    文章分类
    最新评论