前言:
最近在写树中用到了数组,ATL中的 AtlSimpleArray 这个类封装了一个简单数组,简单高效。
正因为简单,没有带插入数据功能, 下面是我实现的一个函数,任意位置插入。 两句内存操用。 这样做有一个不好的地方是,容易产生内存碎片。 所以如果操作非常非常多 就要用List了。
look source
#include "stdafx.h"
#include <atlcoll.h>
class DemoClass
{
public:
DemoClass(int num)
{
m_num = num;
}
~DemoClass()
{
printf("析构%d\n", m_num);
}
int m_num;
};
int _tmain(int argc, _TCHAR* argv[])
{
CSimpleArray<DemoClass*> arrys;
for (int i = 0; i < 400; i ++)
{
arrys.Add(new DemoClass(i));
}
int iIndex = 4;
/////////////////////////////////////
if( ++arrys.m_nSize >= arrys.m_nAllocSize)
{
DemoClass** aT;
int nNewAllocSize = (arrys.m_nAllocSize == 0) ? 1 : (arrys.m_nSize * 2);
if (nNewAllocSize<0||nNewAllocSize>INT_MAX/sizeof(DemoClass*))
{
return FALSE;
}
aT = (DemoClass**)_recalloc(arrys.m_aT, nNewAllocSize, sizeof(DemoClass*));
if(aT == NULL)
return FALSE;
arrys.m_nAllocSize = nNewAllocSize;
arrys.m_aT = aT;
}
if (arrys.m_aT)//not null
{
memmove(&arrys.m_aT[iIndex + 1], &arrys.m_aT[iIndex], (arrys.m_nSize - iIndex - 1) * sizeof(DemoClass*));
// 5在3处插入 移动 345
//////////////////
//
// 5插入
// 0 1 2 3 ^ 4 5 6 7 8 9
//
}
//arrys.m_aT[iIndex] = new DemoClass(88888);
DemoClass* bbc = new DemoClass(88888);
arrys.SetAtIndex(iIndex, bbc);
int j = 0;
while(j < arrys.GetSize())
{
printf("%d\n", arrys[j]->m_num);
j++;
}
printf("%d\n", arrys.GetSize());
return 0;
}
相关推荐
本文将详细介绍如何在 ATL/MFC DLL 中实现数组的有效传递,包括数组作为参数传入函数以及作为返回值从函数传出的情况。 #### 二、将数组打包到 VARIANT 在 COM 编程中,`VARIANT` 类型常用于封装多种数据类型,以...
总结来说,利用ATL ActiveX绘制任意平面函数的曲线涉及到ATL COM组件的创建、`IDispatch`接口的实现、函数字符串解析、图形绘制以及控件的注册与测试。这个过程既包含了编程技术,也涵盖了数学与图形学的运用,对于...
**VC6功能完整版本安装详解:插入ATL对象** Visual C++ 6.0(简称VC6)是Microsoft公司发布的一款经典且强大的C++开发工具,尤其在Windows平台上的应用程序开发中占据着重要地位。然而,不同的VC6版本在功能上有所...
1. **ATL::CArray**:这是一个动态数组,允许在运行时动态增加或减少元素。它提供插入、删除、查找和遍历操作,并支持固定大小的元素类型。 2. **ATL::CMap**:类似STL的std::map,但更适用于COM环境。它存储键值对...
同时,ATL还支持内联函数,以减少运行时的开销,提高代码执行效率。 1. ATL的基础:COM对象和接口 - COM是微软定义的一种二进制标准,允许不同进程中的对象交互。ATL简化了COM对象的创建,包括IUnknown接口的实现...
例如,如果你有一个名为`MyInterface`的接口,你可以使用`DECLARE_INTERFACE_(MyInterface, IUnknown)`来声明它,并使用`ATL_IMPL_INTERFACE_MAP`宏来实现接口的方法。 3. **导出对象(Exported Object)**: 使用`...
9. ** ATL事件处理**:ATL支持事件处理,通过IDispEventImpl模板,可以轻松地实现对IDispatch接口事件的支持。 10. ** ATL与WTL(Windows Template Library)**:WTL是另一款微软的C++库,专为Windows API编程提供...
本主题将深入探讨如何在ATL项目中使用类型库来实现IDispatch接口。 首先,类型库(Type Library)是COM组件中存储元数据的地方,包括接口、方法、属性等信息。通过类型库,客户端可以获取到对象的ITypeInfo接口,...
python实现ICESat-2 ATL08转shapefile
在ATL中,使用`DECLARE_CLASSFACTORY`和`DECLARE_PROPPAGEIDS`等宏来声明类工厂和属性页,然后使用`ATL::_ATL_BASE_MODULE`或`ATL::_ATL_MODULE`来实现。 - **导出与注册**:ATL提供了自动导出和注册COM组件的功能。...
ATL旨在简化接口实现、减少代码量,并提高程序性能。 ATL的核心特性包括: 1. **接口实现**: ATL提供了一套宏和模板,如`DECLARE_INTERFACE_`和`BEGIN_AFX_COM_MAP`,使得开发者可以快速方便地声明和实现COM接口。...
4. **接口实现**:ATL通过使用宏(如DECLARE_INTERFACE_、DECLARE_PROPPAGEIDS等)简化了接口的声明和实现。这些宏将接口方法映射到成员函数,并处理IUnknown的相关操作。 5. **事件处理**:ATL支持OLE Automation...
本书主要介绍了ATL技术的原理、内部实现和应用技巧,由当今4 位顶尖的 Windows技术专家联合撰写。全书内容丰富,深入浅出,主要涵盖了ATL内部架构和实现方法、运用向导简化ATL开发、C++/COM/ATL中字符串的使用技巧、...
在VB测试程序中,你可以使用`CreateObject`函数来创建ATL COM对象,并调用其接口方法。例如: ```vb Dim obj As New MyObject obj.DoSomething 42 ``` 在`com中返回com.txt`文件中,可能包含的是关于如何在已有的...
下面将详细介绍ATL COM的相关知识点以及如何实现这个加法函数。 1. ATL基础: - ATL项目创建:首先,你需要在Visual Studio中创建一个新的ATL项目。在项目设置中,选择ATL简单对象作为模板,并为你的COM对象命名。...
4. **事件处理**:ATL提供了`BEGIN_DISPATCH_MAP`和`BEGIN_EVENT_MAP`宏,方便地实现了DISPID到成员函数的映射,简化了事件处理。 5. **服务器和控件的创建**:ATL可以用来创建EXE服务器、DLL服务器以及ActiveX控件...
在这个“atl\ATL实现定制的IE浏览器栏·工具栏和桌面工具栏.rar”压缩包中,包含的是使用ATL创建自定义IE浏览器栏、工具栏以及桌面工具栏的示例代码和相关资源。以下将详细讲解这些知识点。 **ATL基础知识** ATL是...
- CAtlArray、CAtlMap、CAtlString:ATL提供的高效数据结构,用于数组、映射和字符串操作。 - CAtlModule和CAtlExeModuleT:模块类模板,用于初始化和注册COM服务器。 7. ATL与MFC(Microsoft Foundation Classes...
ATL是一个高效、轻量级的库,专为构建COM组件而设计,简化了COM对象的实现过程。 一、COM基础 COM是微软提出的一种二进制接口标准,用于组件间的交互。它定义了一套规则和接口,使得不同语言和平台编译的组件能够...