2409atl,atl3.0到7.0的变化

2024-09-07 05:04
文章标签 变化 7.0 atl3.0 2409atl

本文主要是介绍2409atl,atl3.0到7.0的变化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文

本文不介绍新的ATL7服务器类和属性.这不是一个完整的列表,只是我目前找到的.

串转换宏一些限制.它从分配内存,可能会在大串时溢出栈.函数退出时,释放该串,而不是在函数引入的域释放.

它使用过时OLE2ANSI定义.如果你查看MSDN上对_alloca(来转换)的注意,它说它在SEHC++EH中使用时有限制.

如,看一下ATL3串转换宏:

USES_CONVERSION;
try
{for(int i=0; i< 100000; ++i)LPTSTR str = OLE2T(L"Some string string string string string........");
|||//栈溢出,栈上的内存增长...//如果上述没有失败,则确保`catch(int)`throw int(1); //
}
catch(int)
{LPTSTR str = OLE2T(L"Some string string string string string........");
||//`_alloca`不能在`SEH`中使用,否则`EH`生成未处理异常,在`VS.NET`中,`C++`编译时按错误标记
}

ATL7:

串转换宏/类在上述方面有所改进.它对小串使用栈内存,对大串使用堆,因此当栈空间不足时不会溢出栈.串在结束域释放,而不是在函数退出时释放.

可在异常处理器中用.可在循环中使用(因为可由控制).

宏名更易读.形式与以前一样:SourceType2[C]DestinationType.

从:
1,AANSI/WUnicode/Tgeneric到[常数]A,ANSI/W,Unicode/T,generic.
2,CA2T/CA2CT,根据美标定义从美标到通用串_UNICODE
3,CT2A/CT2CA,根据T定义从T通用串ANSI_UNICODE
4,CT2W/CT2CW,从T通用串统一
5,CW2T/CW2CT,根据_UNICODE定义从统一到通用串
6,CT2WEX/CT2CWEX,可指定从T通用统一串和缓冲
7,CW2TEX/CW2CTEX,可指定从统一T的通用串和缓冲
8,CA2W,从美标统一
9,CW2A族,从统一美标
10,CW2AEX/CA2WEX,上述某些typedef/macro使用的实际类.

所以上面代码像这样,不会崩溃:

try
{for(int i=0; i< 100000; ++i)CW2A str(L"Some string string string string string........");throw int(1);
}
catch(int)
{CW2A str(L"Some string string string string string........");
}

注意警告.上述所有宏都不能在ATL3代码构造中使用:

LPTSTR str = CW2A(L"some string");

上面代码是错误的.该行后,会析构CW2AEX创建的临时对象.

注意,宏表示C++类,并受域规则控制.
查看问题,请试以下操作:

//使用以2初化串长`大小`,以确保栈大小不够,且对内存用`堆`
LPCTSTR szr = CW2AEX<2>(L"some string");
szr; //在这一行`szr`应该指向`垃圾`

CString:

另一个附加是来操作串的CStringT类.即使此类公开的方法与以前的MFCCString相同.它不是旧的MFCCString.

此类是模板的.它与char,wchar_tTCHAR一起使用的很少.CString是一个:

CStringT< TCHAR, StrTraitATL< TCHAR > > CAtlString;

根据是否使用MFC重定义,这样:

//`#ifdef_AFX`
typedef CAtlString CString;

CStringT自身在MFC/ATL间共享.默认,它使用CRT,但可定义_ATL_MIN_CRT_ATL_CSTRING_NO_CRT来更改CRT.

这反之又使编译器可见相应的,如:

 //使用`CRT`并有更多功能
CStringT< TCHAR, StrTraitATL< TCHAR, ChTraitsCRT< TCHAR > >
or//不使用`CRT`,而是使用`win32API`串函数`(wvsprintf,lstrlen,CharNext`等)CStringT< TCHAR, StrTraitATL< TCHAR >, ChTraitsOS<TCHAR> >

另一个CFixedStringT类提供固定的预分配连续缓冲,以优化管理内存.

可通过实现IAtlStringMgr,来自定义管理内存,且已有CAtlStringMgr实现.
它的构造器IAtlMemMgr的指针,IAtlMemMgr可以是预定义的实现,也可是你自己的实现:

1,CCRTHeap,使用CRT
2,CWin32Heap,使用win32
3,CComHeap,使用COM任务分配内存器.
等.如:

CComHeap comHeap;
CAtlStringMgr mg(&comHeap);
CString str(&mg);
str += "some string";

::CoTaskMemAlloc分配内存.

"串和文本类"(MSDN)
"ATL/MFC串转换宏"(MSDN)

集合

ATL7引入了新的集合类.这些类的接口与以前的MFC集合类类似.
这些类是模板类,可传递自己的CElementTraits来处理特例,如CopyElements,RelocateElements,CompareElementsHash.

CAtlArray/CAtlList:

//使用`CStringElementTraits`有效`查找`比较
CAtlArray<CString, CStringElementTraits<CString> > array;//其他特征包括`CStringRefElementTraits,CStringElementTraitsI`
CAtlList<CString, CStringElementTraits<CString> > list;
list.AddHead(CString("hello"));
list.AddHead(CString("string"));
POSITION pos = list.Find("hello");
if(pos != NULL)
{CString str = list.GetAt(pos);
}

CAtlMap

CAtlMap<CString, int, CStringElementTraits<CString> > map;
map.InitHashTable(269);
map["key1"] = 2;
map["key2"] = 2;
int value;
if(map.Lookup("key1", value));

基于红黑树实现CRBTree/CRBMap/CRBMultiMap

CRBMap<int, int> rbMap;
rbMap.SetAt(10, 20);
rbMap.SetAt(30, 40);
CRBMap<int, int>::CPair* p = rbMap.Lookup(30);
//`p->m_key;P->m_value;`
rbMap.RemoveKey(30);

其他各种更特化的类:

CAutoPtrArray/CAutoPtrList/CComUnkArray/CHeapPtrList/CInterfaceArray/CInterfaceList

"集合类"(MSDN)

线程

CWorkerThread<Win32ThreadTraits|CRTThreadTraits>:

简单示例:

class WorkerClass : public IWorkerThreadClient
{HANDLE m_hEvent;CWorkerThread<Win32ThreadTraits> m_thread;
public:
WorkerClass(){m_thread.Initialize();m_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);m_thread.AddHandle(m_hEvent, this, NULL);}~WorkerClass(){m_thread.RemoveHandle(m_hEvent);m_thread.Shutdown();}void ResumeThread(){::SetEvent(m_hEvent);}void FreezeThread(){::ResetEvent(m_hEvent);}
private://`IWorkerThreadClient`HRESULT Execute(DWORD_PTR dwParam, HANDLE hObject){FreezeThread();return S_OK;}HRESULT CloseHandle(HANDLE hHandle){::CloseHandle(hHandle);return S_OK;}
};
Then:
{WorkerClass work;work.ResumeThread();Sleep(5000);work.ResumeThread();Sleep(5000);
}

下面是CThreadPool的理想用法:

struct IDoSomeWork
{virtual void Work()=0;
};
class Work1 : public IDoSomeWork
{void Work(){}
};
class Work2 : public IDoSomeWork
{void Work(){}
};
class ThreadPoolWorker
{public:
//支持`CThreadPoolWorker`原型typedef IDoSomeWork* RequestType;BOOL Initialize(void* pvWorkerParam){return TRUE;}void Execute(RequestType request, void* pvWorkerParam,OVERLAPPED* pOverlapped){request->Work();}void Terminate(void* pvWorkerParam){}
};
{CThreadPool<ThreadPoolWorker> pool;pool.Initialize();
//
IDoSomeWork* pWork1=new Work1();
pool.QueueRequest(pWork1);
//
IDoSomeWork* pWork2=new Work2();
pool.QueueRequest(pWork2);
//Sleep(5000);delete pWork1; delete pWork2;
}

管理内存

CHeapPtr<CComAllocator | CCRTAllocator>:
CHeapPtr<int, CComAllocator> ptr;
ptr.Allocate(100);//该类不适合对象数组,因为它不调用`delete[]`,而只调用`删`.
CAutoPtr<CString> ptr(new CString("string"));
CAutoVectorPtr<CString> pVec(new CString[100]); //这会调用`delete[]`

CComGITPtr中:

管理GIT表中的指针.创建GIT并调用IGlobalInterfaceTable方法.

其他更特化的类包括:
1,CAutoPtrArray
2,CAutoPtrList
3,CComHeap
4,CComHeapPtr
5,CComPtrBase
6,CCRTAllocator
7,CCRTHeap
8,CGlobalHeap
9,CHandle
10,CHeapPtrBase
11,CHeapPtrList
12,CLocalHeap
13,CWin32Heap

管理内存类(MSDN)

文件

1,CAtlFilewin32API的文件精简包装器.CreateFile,ReadFile,WriteFile等.
2,CAtlTemporaryFile可用于临时文件.会自动命名,打开,关闭和删除它们.
3,CAtlFileMappingBase/CAtlFileMapping可用来映射文件:

CAtlTemporaryFile file;
CAtlFileMapping<char> filemap;
file.Create(NULL, GENERIC_READ|GENERIC_WRITE);
file.SetSize(1024);
filemap.MapFile(file, 1024, 0, PAGE_READWRITE, FILE_MAP_READ|FILE_MAP_WRITE);
char* pMem = filemap;
strcpy(pMem, "hello");

安全

ATL7包括win32API安全性的包装器.
快速示例:

CSid sidDenied;
sidDenied.LoadAccount("Leo");
CDacl dacl;
//试`拒绝`或`允许`并查看`OpenEvent`稍后的行为
dacl.AddDeniedAce(sidDenied, GENERIC_ALL);
//dacl.AddAllowedAce(sidDenied,GENERIC_ALL);
CSecurityDesc desc;
desc.SetDacl(dacl);
CSecurityAttributes secattr(desc);
//限制`命名事件的权限`
CHandle hEvent(CreateEvent(&secattr, FALSE, FALSE, "NamedEvent"));
//试用所有访问权限打开它
CHandle hEventOpen(OpenEvent(EVENT_ALL_ACCESS, FALSE, "NamedEvent"));
//如果在上面添加了`拒绝`,它应该会失败.如果添加了`允许`,则应会成功if(GetLastError() == ERROR_ACCESS_DENIED)ATLTRACE("\n\nAccess denied when opening event\n\n");
CSecurityDesc descCheck;
AtlGetSecurityDescriptor("NamedEvent",SE_KERNEL_OBJECT, &descCheck);
CDacl daclCheck;
descCheck.GetDacl(&daclCheck);
CSid::CSidArray sidarr;
daclCheck.GetAclEntries(&sidarr);
for(UINT i=0; i<sidarr.GetCount(); ++i)
{ATLTRACE("%s\n", (LPCTSTR)sidarr[i].Sid());ATLTRACE("%s\n", (LPCTSTR)sidarr[i].AccountName());ATLTRACE("%s\n", (LPCTSTR)sidarr[i].Domain());
}

杂项

#import现在可取progid/libid而不仅是硬编码文件名.如:

#import <libid:20000000C-500A-100BB005-000000000000> version("2.2")
#import "progid:SomeServer.哈哈.1" embedded_idl, no_namespace

1,按如:CAtlComModule/CAtlWinModule/CAtlDllModuleT/CAtlExeModuleT/CAtlServiceModuleT/等其他类替换CComModule.
2,不再显式调用Init()/Term().这些方法现在由模块类的相应ctor/dtor调用.
3,不再需要BEGIN_OBJECT_MAP/END_OBJECT_MAP.改用全局域内的OBJECT_ENTRY_AUTO.
4,并在链接自动生成ATL对象映射中.它使用链接器段声明把所有全局的映射项收集到一个列表中.

CComCurrency,CURRENCY类型的包装器
CAtlException,定义与ATL相关的异常

CImage,根据GDI+.可用jpeg,gif,bmp,png.见"早期系统的CImage限制"(MSDN)
_U_STRINGorID/_U_MENUorID/_U_RECT/CPoint/CRect/CSize,各种简单的包装器.见"工具类"(MSDN)
atlsync.h中定义的同步包装器:CCriticalSection,CEvent,CMutexCSemaphore.但在MSDN没有记录它们.

这篇关于2409atl,atl3.0到7.0的变化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144129

相关文章

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

c++的静态变化!

静态成员   对于非静态成员,一个类的每个对象都自己存有一个副本,每个对象根据自己拥有的非静态的数据成员来区别于其他对象。而静态成员则解决了同一个类的多个对象之间数据和函数的共享问题。   静态数据成员   静态数据成员的作用是:实现同一类的不同对象之间的数据共享。   #include<IOSTREAM>   using namespace std;   class Po

包拯断案 | 数据库从库GTID在变化 为何没有数据写入@还故障一个真相

提问:作为DBA运维的你是否遇到过这些烦恼 1、数据库从库复制链路如何正确配置表过滤信息? 2、数据库从库的GTID在变化,实际却没有数据写入,究竟是什么原因? 心中有章,遇事不慌 作为DBA的你,遇到问题无从下手,除了在问题面前徘徊,还能如何选择?如果你一次或多次遇到该问题还是 无法解决,又很懊恼,该如何排忧呢?关注公众号,关注《包拯断案》专栏,让小编为你排忧解难~ #包拯秘籍#

2020年SEO行业发展变化和趋势分析!

一、搜索引擎算法发展轨迹 第一阶段:人工目录(1997年-2001年“雅虎早期搜索模式”); 第二阶段:文本分析(2001年-2004年“以关键词和背景颜色一样,堆积大量关键词,就会有非常好的排名; 第三阶段:链接分析(2004年-2009年“以反向链接为核心算法的阶段”),这时行业内有句话是内容为王,外链为皇; 第四阶段:智能分析(2009年-现在“以满足用户人性化需求的用户浏览行为分析

保姆级教学:OC监听网络状态变化 Reachability监听网络变化 ios网络变化

本文主要讲解了,在oc开发中,怎么去使用代码进行网络监听,十分的通俗易懂。 首先,在xcode工程中导入SystemConfiguration框架。 然后导入Reachability.h文件。 Reachability文件 点击下载,也可以按照如下内容创建对应的文件。 Reachability.m //文件名Reachability.m/*Copyright (C) 2016 App

Vue2升级Vue3 --- 第三方库变化(基于gogocode)

本次升级基于gogocode快捷转换gogocode升级体验,汇总的部分问题可能与gogocode有关,但仍可作为vue2升级vue3过程中报错问题的解决参考 第三方库变化 1.vue-contextmenujs(右键菜单) // 原第三方库不支持vue3,更换为支持vue3的库"@imengyu/vue3-context-menu": "^1.0.8"// 更换库后组件样式与以前不

有temp表包含A,B两列,使用SQL,对B列进行处理,形成C列,按A列顺序,B列值不变,则C列累计技术,B列值变化,则C列重新开始计数

有temp表,使用SQL,对B列进行处理,形成C列,按A列顺序,B列值不变,则C列累计技术,B列值变化,则C列重新开始计数 建表语句如下 CREATE TABLE temp(A STRING ,B STRING );INSERT INTO TABLE temp VALUES('2010','1'),('2011','1'),('2012','1'),('2013','0'),('2014',

用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化

概述 WWDC 24 一声炮响为我们送来 Swift 6.0 的同时,也颇为“低调”的推出了 SwiftData 2.0。在新版本的 SwiftData 中,苹果为其新增了多个激动人心的新特性,其中就包括历史记录追踪(History Trace)。 不过,历史记录追踪目前看起来似乎有些“白璧微瑕”,略微让人有些不爽。在这里就让我们看看如何利用 Swift 结构化并发中的异步序列(Asy

遥感技术在环境监测中的应用:揭秘地球变化的天眼

当我们仰望星空,探索宇宙的奥秘时,别忘了脚下的这片土地同样蕴藏着无数未解之谜。遥感技术,这个听起来似乎遥不可及的名字,其实正是我们透视地球环境变化的“天眼”。今天将带大家一探遥感技术如何在环境监测中大显身手,帮助我们更精准地监测和评估这个星球的每一次呼吸与脉动。 什么是遥感技术? 遥感,顾名思义,是从远处感知。它利用安装在卫星、飞机或其他平台上的传感器,捕捉地球表面的电磁辐射信息,包括可见光、

1、快速响应市场和技术变化的深度探讨

在当今技术飞速发展和市场竞争日益激烈的时代,企业面临的最大挑战之一就是如何快速响应市场和技术变化。市场需求不断变化,新技术层出不穷,传统的静态计划和僵化的管理方式已经无法满足快速变化的需求。本文将深入探讨“快速响应市场和技术变化”的关键点,从信息流通、组织架构、决策机制、技术应用到文化和领导力进行详细分析,帮助企业建立高效的响应机制。 1. 信息流通和感知能力建设 信息流通和感