给ATL项目添加MFC支持.doc_第1页
给ATL项目添加MFC支持.doc_第2页
给ATL项目添加MFC支持.doc_第3页
给ATL项目添加MFC支持.doc_第4页
给ATL项目添加MFC支持.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ATL是ActiveXTemplateLibrary的缩写,它是一套C+模板库。使用ATL能够快速地开发出高效、简洁的代码,同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。为了方便使用,从MicrosoftVisualC+5.0版本开始,Microsoft把ATL集成到VisualC+开发环境中。1998年9月推出的VisualStudio6.0集成了ATL3.0版本。在ATL产生以前,开发COM组件的方法主要有两种:一是使用COMSDK直接开发COM组件,另一种方式是通过MFC提供的COM支持来实现。直接使用COMSDK开发COM组件是最基本也是最灵活的方式。通过使用Microsoft提供的开发包,我们可以直接编写COM程序。但是,这种开发方式的难度和工作量都很大,一方面,要求开发者对于COM的技术原理具有比较深入的了解(虽然对技术本身的深刻理解对使用任何一种工具都是非常有益的,但对于COM这样一整套复杂的技术而言,在短时间内完全掌握是很难的);另一方面,直接使用COMSDK要求开发人员自己去实现COM应用的每一个细节,完成大量的重复性工作。这样做的结果是,不仅降低了工作效率,同时也使开发人员不得不把许多精力投入到与应用需求本身无关的技术细节中。虽然这种开发方式对于某些特殊的应用很有必要,但这种编程方式并不符合组件化程序设计方法所倡导的可重用性,因此,直接采用COMSDK不是一种理想的开发方式。使用MFC提供的COM支持开发COM应用可以说在使用COMSDK基础上提高了自动化程度,缩短了开发时间。MFC采用面向对象的方式将COM的基本功能封装在若干MFC的C+类中,开发者通过继承这些类得到COM支持功能。为了使派生类方便地获得COM对象的各种特性,MFC中有许多预定义宏,这些宏的功能主要是实现COM接口的定义和对象的注册等通常在COM对象中要用到的功能。开发者可以使用这些宏来定制COM对象的特性。随着Internet技术的发展,Microsoft将ActiveX技术作为其网络战略的一个重要组成部分大力推广,然而使用MFC开发的ActiveXControl,代码冗余量大,即所谓的“肥代码”(FatCode),而且必须要依赖于MFC的运行时刻库才能正确地运行。虽然MFC的运行时刻库只有部分功能与COM有关,但是由于MFC的继承实现的本质,ActiveXControl必须背负运行时刻库这个沉重的包袱。如果采用静态连接MFC运行时刻库的方式,这将使ActiveXControl代码过于庞大,在网络上传输时将占据宝贵的网络带宽资源;如果采用动态连接MFC运行时刻库的方式,这将要求浏览器一方必须具备MFC的运行时刻库支持。总之,MFC对COM技术的支持在网络应用的环境下也显得很不灵活。MFC对COM和OLE的支持确实比手工编写COM程序有了很大的进步。但是MFC对COM的支持还不够完善和彻底,例如对COM接口定义的IDL语言,MFC并没有任何支持,此外对于近些年来COM和ActiveX技术的新发展MFC也没有提供灵活的支持。这是由MFC设计的基本出发点决定的。MFC被设计成对Windows平台编程开发的面向对象的封装,自然要涉及Windows编程的方方面面,COM作为Windows平台编程开发的一个部分也得到MFC的支持,但是MFC对COM的支持是以其全局目标为出发点的,因此对COM的支持必然要服从其全局目标。从这个方面而言,MFC对COM的支持不能很好地满足开发者的要求。对于程序员来说,还有一个区别就是ATL要求你懂得更多的COM知识,这样你才能直接使用ATL来编写COM组件或者控件,而MFC甚至不要求你知道COM是个什么东西就能写出一个ActiveX控件来了。此外,如果你编写的控件有GUI(图形用户界面)的话,你最好使用MFC;如果根本不需要GUI,那最好使用ATL编写,当然你也可以选择MFC来编写不可见的控件,但是开销比ATL大,而执行效率却小于ATL;但是有时候这种差别所带来影响可以忽略掉的话,那么我建议你还是用MFC来写,唯一的理由是它开发起来更简单,易于调试。如果你是一个COM的门外汉,却又想使用ATL来编写控件,那么建议你先准备半年时间(保守估计)来学习COM的理论知识简单地说,ATL在网络应用普及的今天,开发效果(简洁高效)要比MFC好.但我本人觉得MFC也不差!我一直在用MFC做事!=MFC、ATL和CLR是VC2005内置的3大库,涵盖了windows的各种开发方法和开发应用。当然关于C+开发的库不止这3个,不过这3个是微软推荐。从编程所处层次而言,WIN32为最底层,其次是MFC.然后是CLR. WIN32 winAPI MFC MFC类库 CLR .net库1. WIN32常规就是不用MFC,使用API函数编的程序。2. MFC库有很多年的历史了,MFC是基于Windows API 的简单封装。其核心架构基于Document/View架构(20年前被认为很潮流的一种概念)和消息流动机制。这个库自从VC6开始到现在都没有多大改动。MFC封装的范围包括GUI,IO,数据库,网络编程等等方面。但是很多系统开发必须的api都没有封装,这样开发者一般都在MFC的基础上自己处理与业务相关的任务。事实上很多人用MFC只是利用其GUI部分的封装。这个库GUI处理的效率也并不是很高,有时候与UI处理相关的代码会占到整个项目的一半甚至更多。总的来说,这是一个垂老的库,微软在10年以来,除了对MFC进行修修补补以外,没有进行大的改进或者更新。如果你问MFC还会活多久?恩,这是个问题。如果有一天MFC不在了,微软在这个级别上并没有其他产品能够代替它。3. CLR库是随着.Net Framework 2 和VS2005一起发布的库,其核心的实现和C#,VB.net 一样。都是基于公共语言运行库。.Net Framework封装了大量系统的api,以类库的形式提供给开发者。C+中的CLR库可以使用其中和本机代码有关的部分,目前C+还不能涉及到部分。CLR库中的C+颠覆了很多标准C+的传统,甚至可以说,这里的C+不是C+,只是披着C+的皮干其他的事。这里的C+更像是C#或者类似的语言。所以这里不叫C+,而叫做C+/CLI,值得一提的是,有关C+/CLI的部分目前还没有被标准C+接受,最近微软有关C+/CLI标准化的提案被C+标准化委员会拒绝了。所以C+/CLI目前还是微软的一家之言。4. ATL用于编写COM程序。ATL库貌似也年纪很大了,至少在我接触到VC的时候就有它的存在了。这个库可以追溯到COM组件,因为ATL的目的就是帮助开发者更好的与COM交互。到底什么时候有COM这个东西的 ?我也不知道,我只知道COM是有16位版本的,在Windows升级到32位的时候COM也随着升级到了32位。COM就像一些封装好的类对象一样,通过封装系统的api,提供一些标准的方法来给你使用。所以系统中有什么组件,就可以在ATL中用什么方法 。所以ATL不止可以写ActiveX,也可以有window,也可以有其它。有时候有些微软发布的功能是只以COM组件的形式发布的,例如MSXML,这时候MFC就不适合,是要ATL来处理的。但是ATL在处理UI这方面并不是很强,所以微软工程师有一个开源的UI 框架,叫做WTL,专门用来处理UI的。ATL库的缺点是,作为模板库,在出现错误的时候会比较麻烦,出错提示会牛头不对马嘴。 自己查找 询问社区 实时帮助请选择您需要帮助的产品 Windows Internet Explorer Office Surface Media Player Skype Windows Phone 更多产品HOWTO: 给 ATL 项目添加 MFC 支持文章编号: 173974 -查看本文应用于的产品本文的发布号曾为 CHS173974展开全部|关闭全部本页概要当使用 AppWizard 创建 ATL EXE 项目时,MFC 支持复选框未被选中。 本文讲述如何将 MFC 支持添加到 ATL EXE 项目中。 本文还解释了如果在 AppWizard 中最初不能选中“Support MFC”复选框,如何给 ATL DLL 项目添加 MFC 支持。回到顶端|提供反馈更多信息给 ATL EXE 项目添加 MFC 支持1. 在包括 Atlbase.h 之前,将以下 #include 指令添加到 StdAfx.h:2. #include / MFC core and standard components3. #include / MFC extensions #include / MFC Automation extensions4. 更改项目设置以使用 MFC。 在Project Settings对话框中,单击General选项卡,然后将Microsoft Foundation Classes列表框中的设置更改为 MFC。5. 添加 CWinApp 衍生类,并声明一个该类型的全局变量,如下所示:6. class CMyApp : public CWinApp7. 8. public:9. virtual BOOL InitInstance();10. virtual int ExitInstance();11. protected:12. BOOL m_bRun;13. 用以下 InitInstance 和 ExitInstance 代码替换 _tWinMain 函数:14. BOOL CMyApp:InitInstance()15. 16. / Initialize OLE libraries.17. if (!AfxOleInit()18. 19. AfxMessageBox(_T(OLE Initialization Failed!);20. return FALSE;21. 22.23. / Initialize CcomModule.24. _Module.Init(ObjectMap, m_hInstance);25. _Module.dwThreadID = GetCurrentThreadId();26.27. / Check command line arguments.28. TCHAR szTokens = _T(-/);29. m_bRun = TRUE;30. LPCTSTR lpszToken = FindOneOf(m_lpCmdLine, szTokens);31. while (lpszToken != NULL)32. 33. / Register ATL and MFC class factories.34. if (lstrcmpi(lpszToken, _T(Embedding)=0 |35. lstrcmpi(lpszToken, _T(Automation)=0)36. 37. AfxOleSetUserCtrl(FALSE);38. break;39. 40. / Unregister servers.41. / There is no unregistration code for MFC42. / servers. Refer to Q186212 HOWTO: Unregister MFC43. / Automation Servers for adding unregistration44. / code.45. else if (lstrcmpi(lpszToken, _T(UnregServer)=0)46. 47. VERIFY(SUCCEEDED(_Module.UpdateRegistryFromResource(IDR_ServerS2B, FALSE);48. VERIFY(SUCCEEDED(_Module.UnregisterServer(TRUE);49. m_bRun = FALSE;50. break;51. 52. / Register ATL and MFC objects in the registry.53. else if (lstrcmpi(lpszToken, _T(RegServer)=0)54. 55. VERIFY(SUCCEEDED(_Module.UpdateRegistryFromResource(IDR_ServerS2B, TRUE);56. VERIFY(SUCCEEDED(_Module.RegisterServer(TRUE);57. COleObjectFactory:UpdateRegistryAll();58. m_bRun = FALSE;59. break;60. 61. lpszToken = FindOneOf(lpszToken, szTokens);62. 63. if (m_bRun)64. 65. / Comment out the next line if not using VC 6-generated66. / code.67. _Module.StartMonitor();68.69. VERIFY(SUCCEEDED(_Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE);70. VERIFY(COleObjectFactory:RegisterAll();71. / To run the EXE standalone, you need to create a window72. / and assign the CWnd* to m_pMainWnd.73. LPCTSTR szClass = AfxRegisterWndClass(NULL);74. m_pMainWnd = new CWnd;75. m_pMainWnd-CreateEx(0, szClass, _T(SomeName), 0, CRect(0, 0, 0, 0), NULL, 1234);76. 77. return TRUE;78. 79.80. int CMyApp:ExitInstance()81. 82. / MFCs class factories registration is83. / automatically revoked by MFC itself.84. if (m_bRun)85. 86. _Module.RevokeClassObjects();87. Sleep(dwPause); /wait for any threads to finish88. 89.90. _Module.Term();91. return 0;92. 对于 Unicode 版本,请确保进入点被设置为 wWinMainCRTStartup,该设置在Project Settings对话框中Link字段的Output类别中。 有关其它信息,请参见 Microsoft Knowledge Base 中的下列文章:125750PRB: 错误 LNK2001: “_WinMain16”: 不能解析的外部符号93. 将以下代码行添加到 COM 接口、窗口过程和导出函数的每个成员函数的开头:AFX_MANAGE_STATE(AfxGetAppModuleState();有关 AFX_MANAGE_STATE 的详细信息,请查询 VC+ 联机文档。有关将 MFC 支持添加到 ATL COM AppWizard 项目的详细信息,请参见下面的 Microsoft Knowledge Base 文章:181505PRB: ATL COM AppWizard 不提供对 .EXE 的 MFC 支持将 MFC 支持添加到 ATL DLL 项目执行上面的步骤 1 到步骤 3。1. 将 AppWizard 生成的 DllMain 的 DLL_PROCESS_ATTACH 和 DLL_PROCESS_DETACH 中的代码移到 CMyApp 的 InitInstance 和 ExitInstance,并删除 DllMain,如下所示:2. BOOL CMyApp:InitInstance()3. 4. _Module.Init(ObjectMap, m_hInstance);5. return CWinApp:InitInstance();6. 7.8. int CMyApp:ExitInstance()9. 10. / MFCs class factories registration is11. / automatically revoked by MFC itself.12. if (m_bRun)13. _Module.RevokeClassObjects();14.15. 将以下代码行添加到 COM 接口、窗口过程和导出函数的每个成员函数的开头:AFX_MANAGE_STATE(AfxGetStaticModuleState();有关其它信息,请参见 Microsoft Knowledge Base 中的下列文章:140850HOWTO: 转换 DLLTRACE 以使用共享库中的 MFC备注:对于所有的发行版本,请确保 _ATL_MIN_CRT 预处理器定义已经被删除。 您可以在Project Settings对话框中C/C+选项卡的Preprocessor类别中找到这些定义。当使用 ClassWizard 将一个从 MFC 类衍生的类添加到 ATL EXE 项目或 ATL DLL 项目时,如果没有“MFC 支持”,编译器将发出 C2504 错误消息。回到顶端|提供反馈如何让ATL支持MFCvcproj发表于 2012-05-09 11:15 | 来源:| 阅读 689 views ATL的出现旨在让程序员用C+方便灵活地开发COM对象。ATL本身相当小巧灵活,用它可以创建轻量级的,自包含的,可复用的二进制代码,不用任何附加的运行时DLLs支持。如果我们在ATL工程里面使用了CString、CFile这些常用的基础类的时候调试都不能通过,为什么?因为ATL没有支持MFC,那我们该怎么办? 让ATL支持MFC我们有两种方法,方法一:在新建ATL工程的时候选择支持MFC;方法二:修改ATL工程的生成代码。 方法一比较简单,在新建ATL工程的向导中选中Support MFC,这样生成的ATL工程就能支持MFC用法。但是有时候,你并不是一开始就确定ATL工程需要支持MFC,或者是修改已经存在的ATL工程,这个时候如果重建工程就会浪费很多时间,所以我们需要第二种方法修改工程的代码。 第二种方法的具体操作如下: 1、增加头文件 首先我们修改ATL工程中的StdAfx.h文件,在#include 之前增加下面的代码: #include / MFC core and standard components #include / MFC extensions #include / MFC Automation extensions 2、修改工程设置 点击【Project Settings】对话框的【General】页, 改变 “Microsoft Foundation Classes” 下拉框的值为”Use MFC in a Static Library”或者”Use MFC in a Shared Library” 3、删除ATL工程的DLL入口部分代码 / / DLL Entry Point extern “C” BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) if (dwReason = DLL_PROCESS_ATTACH) _Module.Init(ObjectMap, hInstance, &LIBID_ATLTESTLib); DisableThreadLibraryCalls(hInstance); else if (dwReason = DLL_PROCESS_DETACH) _Module.Term(); return TRUE; / ok 4、增加基于CWinApp的视图类,在删掉位DLL入口的位置上增加下面的代码(将设你的工程类是”CATLTest “) class CATLTestApp : public CWinApp public: / Overrides / ClassWizard generated virtual function overrides /AFX_VIRTUAL(CATLTestApp ) public: virtual BOOL InitInstance(); virtual int ExitInstance(); /AFX

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论