升级基于ATL3.0的项目到ATL7.0(VC6.0 to VS2008)[移植变更点]
ATL3.0与7.0在实现细节方面改变比较多,其中对原来的模版类进行了拆分,实现更为细致。同时,从VC6移过来的程序,为了保证其后的兼容性,如果不是Unicode,最好在本次升级中一步到位。
具体变更:
MyCom程序 |
ATL 3.0(VC6.0 / ANSI) |
ATL 7.0 (Unicode) |
主线程文件: class CMyComApp |
MyCom.cpp中实现: |
在dllmian.cpp中实现; 涉及到主线程相关的函数都在此实现; |
Dll注册函数: DllRegisterServer DllGetClassObject |
MyCom.cpp中实现: |
MyCom.cpp中实现;(该文件中只剩下注册相关的操作) |
CComModule |
ATL 3.0 提供了 CComModule 类。 CComModule _module; |
在 ATL 7.0 中,以前由 CComModule 提供的功能由若干新类处理: 关于句柄相关: 使用CAtlBaseModulet替换: 关于DLL注册相关: 使用CMyComModule:继承自CAtlDllModuleT |
获取句柄 |
_Module.GetModuleInstance() |
_AtlBaseModule.GetModuleInstance() (引用:在altcore.h:extern CAtlBaseModule _AtlBaseModule; |
LPCSTR-》CString |
直接赋值 |
LPCSTR str; CString s = CString(str); |
字符串CString赋值 |
CString section = "IBECOM"; |
CString section = _T("IBECOM"); |
字符串、函数在unicode下的改变: |
Char drive[_MAX_DRIVE]; _splitpath( strFileName, drive, dir, fname, ext ); |
使用unicode,则相应的字符串变量申明都改为宽字符: wchar_t drive[_MAX_DRIVE]; 同样,使用对应的宽字符函数: _wsplitpath(strFileName, drive, dir, fname, ext ); |
字符串转换: CString->LPSTR |
Cstring str; // ansi环境string LPSTR ls = str; |
CString str;// unicode环境string LPSTR ls = new char[str.GetLength()+1]; USES_CONVERSION; lps = W2A(str); 当然,如果在源头都改为char_t更好,也就避免了这样的转换。 |
更多细节请参考:http://msdn.microsoft.com/zh-cn/library/w1sc4t4k.aspx
OVER
本文链接:http://blog.donews.com/me1105/archive/2010/11/26/49.aspx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述