Learning WTL8.0 Part-1 Win32 vs. ATL Windows Programming(2)
2007-09-21 19:39
531 查看
2. “Hello World!” in ATL
为了避免创建ATL COM EXE SERVER的开销和更好地说明Win32与ATL的内在关系,本例程序基于 1.1创建一个Win32 Project的程序创建。
对于ATL Windows编程陌生的,于此处不必过于在意,稍后在3. 对Win32和ATL的初步观察和比较会做一定的讲解。
2.1 修改stdafx.h
在1.1创建的Win32代码中移除或注释掉stdafx.h中的:
[align=left]// Windows Header Files:[/align]
[align=left]#include <windows.h>[/align]
[align=left] [/align]
[align=left]// C RunTime Header Files[/align]
[align=left]#include <stdlib.h>[/align]
[align=left]#include <malloc.h>[/align]
[align=left]#include <memory.h>[/align]
[align=left]#include <tchar.h>[/align]
[align=left] [/align]
[align=left]并在stdafx.h中添加如下的include语句:[/align]
[align=left] [/align]
[align=left]#include <atlbase.h>[/align]
[align=left]extern CComModule _Module;[/align]
[align=left]#include <atlcom.h>[/align]
[align=left]#include <atlwin.h>[/align]
[align=left]#include "CWellcomeWindow.h"[/align]
[align=left] [/align]
2.2 添加CWellcomeWindow.h
[align=left]#pragma once[/align]
[align=left]#include "stdafx.h"[/align]
[align=left] [/align]
[align=left]class CWellcomeWindow : public CWindowImpl<CWellcomeWindow, [/align]
[align=left] CWindow, CFrameWinTraits> {[/align]
[align=left]public:[/align]
[align=left] DECLARE_WND_CLASS(NULL);[/align]
[align=left] [/align]
[align=left] BEGIN_MSG_MAP(CWellcomeWindow)[/align]
[align=left] MESSAGE_HANDLER(WM_CREATE, OnCreate)[/align]
[align=left] MESSAGE_HANDLER(WM_PAINT, OnPaint)[/align]
[align=left] MESSAGE_HANDLER(WM_DESTROY, OnDestroy)[/align]
[align=left] END_MSG_MAP()[/align]
[align=left] [/align]
[align=left] LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)[/align]
[align=left] {[/align]
[align=left] HICON appIcon = LoadIcon(_Module.GetResourceInstance(), [/align]
[align=left] MAKEINTRESOURCE(IDI_LEARNINGWTLPART1_ATL));[/align]
[align=left] this->SetIcon(appIcon);[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)[/align]
[align=left] {[/align]
[align=left] PAINTSTRUCT ps;[/align]
[align=left] CComBSTR wellcome(_T("Hello World!"));[/align]
[align=left] [/align]
[align=left] HDC hdc; // = this->GetDC();[/align]
[align=left] [/align]
[align=left] hdc = this->BeginPaint(&ps); // this->BeginPaint(&ps);[/align]
[align=left] TextOut(hdc, 0, 0, wellcome, wellcome.Length());[/align]
[align=left] this->EndPaint(&ps);[/align]
[align=left] //this->ReleaseDC(hdc);[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)[/align]
[align=left] {[/align]
[align=left] ::PostQuitMessage(0);[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left] }[/align]
};
2.3 修改win32.cpp
[align=left]保留WinMain方法声明和#include "stdafx.h"语句将其余代码删除或注释掉。添加_Module定义,修改WndMain方法体;完成后的代码如下:[/align]
[align=left]#include "stdafx.h"[/align]
[align=left]#include "LearningWTLPart1_ATL.h"[/align]
[align=left] [/align]
[align=left]CComModule _Module;[/align]
[align=left] [/align]
[align=left]int APIENTRY _tWinMain(HINSTANCE hInstance,[/align]
[align=left] HINSTANCE hPrevInstance,[/align]
[align=left] LPTSTR lpCmdLine,[/align]
[align=left] int nCmdShow)[/align]
[align=left]{[/align]
[align=left] UNREFERENCED_PARAMETER(hPrevInstance);[/align]
[align=left] UNREFERENCED_PARAMETER(lpCmdLine);[/align]
[align=left] [/align]
[align=left] _Module.Init(NULL, hInstance);[/align]
[align=left] [/align]
[align=left] CComBSTR appTitle;[/align]
[align=left] appTitle.LoadString(_Module.GetResourceInstance(), IDS_APP_TITLE);[/align]
[align=left] [/align]
[align=left] CWellcomeWindow wnd;[/align]
[align=left] wnd.Create(NULL, 0, appTitle);[/align]
[align=left] [/align]
[align=left] // Main message loop:[/align]
[align=left] MSG msg;[/align]
[align=left] while (GetMessage(&msg, NULL, 0, 0))[/align]
[align=left] {[/align]
[align=left] TranslateMessage(&msg);[/align]
[align=left] DispatchMessage(&msg);[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] _Module.Term();[/align]
[align=left] [/align]
[align=left] return (int) msg.wParam;[/align]
[align=left]}[/align]
[align=left] [/align]
2.4 Build与程序输出
如果在1.1创建一个Win32 Project设置了编译器选项的,先将编译器选项设置恢复为默认值即/TP;
程序输出如下:
以上的程序输出和 1.3 Build与程序输出对比,似乎缺点什么?!在Part-2再作交待。
3. ATL vs. Win32
首先,对Win32编程模型作了一个初步介绍,着重介绍ATL编程模型,这里并不存在对二者有孰优孰劣的假设;由于,对于作为M$ Windows程序员来说,或多或少、或直接或间接得都接触过Win32编程模型,故在本节中轻彼而重此。
其次,对Win32程序和ATL程序的Build过程和产生的可执行文件作一个初步的对照。
3.1 编程模型
Win32编程是整个Windows编程的基石,无论是ATL或WTL;因此,即使是ATL也必然包含Win32编程模型的基础构造块,只是ATL提供了轻量的基础构造块的封装(Encapsulation)。
Win32编程模型的基础构造块主要由Register windows class、Create window/Show window、Message loop和WndProc 4部分构成。
3.1.1 Win32基础构造块和主要流程
3.1.2 ATL基础构造块和主要流程
CComModule::Init & CComModule::Term : 是ATL关于COM Server的部分,在这里不必关注,在后续的WTL学习中还会相应地涉及到;
Main message loop : 在ATL中保留;
3.2 Build过程和程序输出
对Win32版与ATL版的Debug和Release分别作一个初步的对比;为说明一般性问题,在此不考虑编译器优化,因此,无论是Debug抑或Release均采用编译器默认设置。
ATL版的Release,无论是物理文件大小还是运行时空间大小或运行效率都与Win32版的Release接近,且二者除系统库外,基本上不需要其它支持库(可能msvcrt.dll,gdi32.dll等)。
为了避免创建ATL COM EXE SERVER的开销和更好地说明Win32与ATL的内在关系,本例程序基于 1.1创建一个Win32 Project的程序创建。
对于ATL Windows编程陌生的,于此处不必过于在意,稍后在3. 对Win32和ATL的初步观察和比较会做一定的讲解。
2.1 修改stdafx.h
在1.1创建的Win32代码中移除或注释掉stdafx.h中的:
[align=left]// Windows Header Files:[/align]
[align=left]#include <windows.h>[/align]
[align=left] [/align]
[align=left]// C RunTime Header Files[/align]
[align=left]#include <stdlib.h>[/align]
[align=left]#include <malloc.h>[/align]
[align=left]#include <memory.h>[/align]
[align=left]#include <tchar.h>[/align]
[align=left] [/align]
[align=left]并在stdafx.h中添加如下的include语句:[/align]
[align=left] [/align]
[align=left]#include <atlbase.h>[/align]
[align=left]extern CComModule _Module;[/align]
[align=left]#include <atlcom.h>[/align]
[align=left]#include <atlwin.h>[/align]
[align=left]#include "CWellcomeWindow.h"[/align]
[align=left] [/align]
2.2 添加CWellcomeWindow.h
[align=left]#pragma once[/align]
[align=left]#include "stdafx.h"[/align]
[align=left] [/align]
[align=left]class CWellcomeWindow : public CWindowImpl<CWellcomeWindow, [/align]
[align=left] CWindow, CFrameWinTraits> {[/align]
[align=left]public:[/align]
[align=left] DECLARE_WND_CLASS(NULL);[/align]
[align=left] [/align]
[align=left] BEGIN_MSG_MAP(CWellcomeWindow)[/align]
[align=left] MESSAGE_HANDLER(WM_CREATE, OnCreate)[/align]
[align=left] MESSAGE_HANDLER(WM_PAINT, OnPaint)[/align]
[align=left] MESSAGE_HANDLER(WM_DESTROY, OnDestroy)[/align]
[align=left] END_MSG_MAP()[/align]
[align=left] [/align]
[align=left] LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)[/align]
[align=left] {[/align]
[align=left] HICON appIcon = LoadIcon(_Module.GetResourceInstance(), [/align]
[align=left] MAKEINTRESOURCE(IDI_LEARNINGWTLPART1_ATL));[/align]
[align=left] this->SetIcon(appIcon);[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)[/align]
[align=left] {[/align]
[align=left] PAINTSTRUCT ps;[/align]
[align=left] CComBSTR wellcome(_T("Hello World!"));[/align]
[align=left] [/align]
[align=left] HDC hdc; // = this->GetDC();[/align]
[align=left] [/align]
[align=left] hdc = this->BeginPaint(&ps); // this->BeginPaint(&ps);[/align]
[align=left] TextOut(hdc, 0, 0, wellcome, wellcome.Length());[/align]
[align=left] this->EndPaint(&ps);[/align]
[align=left] //this->ReleaseDC(hdc);[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)[/align]
[align=left] {[/align]
[align=left] ::PostQuitMessage(0);[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left] }[/align]
};
2.3 修改win32.cpp
[align=left]保留WinMain方法声明和#include "stdafx.h"语句将其余代码删除或注释掉。添加_Module定义,修改WndMain方法体;完成后的代码如下:[/align]
[align=left]#include "stdafx.h"[/align]
[align=left]#include "LearningWTLPart1_ATL.h"[/align]
[align=left] [/align]
[align=left]CComModule _Module;[/align]
[align=left] [/align]
[align=left]int APIENTRY _tWinMain(HINSTANCE hInstance,[/align]
[align=left] HINSTANCE hPrevInstance,[/align]
[align=left] LPTSTR lpCmdLine,[/align]
[align=left] int nCmdShow)[/align]
[align=left]{[/align]
[align=left] UNREFERENCED_PARAMETER(hPrevInstance);[/align]
[align=left] UNREFERENCED_PARAMETER(lpCmdLine);[/align]
[align=left] [/align]
[align=left] _Module.Init(NULL, hInstance);[/align]
[align=left] [/align]
[align=left] CComBSTR appTitle;[/align]
[align=left] appTitle.LoadString(_Module.GetResourceInstance(), IDS_APP_TITLE);[/align]
[align=left] [/align]
[align=left] CWellcomeWindow wnd;[/align]
[align=left] wnd.Create(NULL, 0, appTitle);[/align]
[align=left] [/align]
[align=left] // Main message loop:[/align]
[align=left] MSG msg;[/align]
[align=left] while (GetMessage(&msg, NULL, 0, 0))[/align]
[align=left] {[/align]
[align=left] TranslateMessage(&msg);[/align]
[align=left] DispatchMessage(&msg);[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] _Module.Term();[/align]
[align=left] [/align]
[align=left] return (int) msg.wParam;[/align]
[align=left]}[/align]
[align=left] [/align]
2.4 Build与程序输出
如果在1.1创建一个Win32 Project设置了编译器选项的,先将编译器选项设置恢复为默认值即/TP;
程序输出如下:
以上的程序输出和 1.3 Build与程序输出对比,似乎缺点什么?!在Part-2再作交待。
3. ATL vs. Win32
首先,对Win32编程模型作了一个初步介绍,着重介绍ATL编程模型,这里并不存在对二者有孰优孰劣的假设;由于,对于作为M$ Windows程序员来说,或多或少、或直接或间接得都接触过Win32编程模型,故在本节中轻彼而重此。
其次,对Win32程序和ATL程序的Build过程和产生的可执行文件作一个初步的对照。
3.1 编程模型
Win32编程是整个Windows编程的基石,无论是ATL或WTL;因此,即使是ATL也必然包含Win32编程模型的基础构造块,只是ATL提供了轻量的基础构造块的封装(Encapsulation)。
Win32编程模型的基础构造块主要由Register windows class、Create window/Show window、Message loop和WndProc 4部分构成。
3.1.1 Win32基础构造块和主要流程
3.1.2 ATL基础构造块和主要流程
CComModule::Init & CComModule::Term : 是ATL关于COM Server的部分,在这里不必关注,在后续的WTL学习中还会相应地涉及到;
Main message loop : 在ATL中保留;
3.2 Build过程和程序输出
对Win32版与ATL版的Debug和Release分别作一个初步的对比;为说明一般性问题,在此不考虑编译器优化,因此,无论是Debug抑或Release均采用编译器默认设置。
[align=center][/align] | [align=center]Debug[/align] | [align=center]Release[/align] | [align=center]比重[/align] |
Win32版 | [align=right]100K[/align] | [align=right]68K[/align] | [align=center] [/align] |
ATL版 | [align=right]244K[/align] | [align=right]88K[/align] | [align=center]D244% | R129%[/align] |
相关文章推荐
- Learning WTL8.0 Part-1 Win32 vs. ATL Windows Programming
- Learning WTL8.0 Part-1 Win32 vs. ATL Windows Programming
- Learning WTL8.0 Part-1 Win32 vs. ATL Windows Programming(1)
- Learning WTL8.0 Part-1 Win32 vs. ATL Windows Programming(3)
- Learning WTL8.0 Part-1 Win32 vs. ATL Windows Programming
- Win32 vs. ATL Windows Programming
- Win32 vs. ATL Windows Programming
- Win32 vs. ATL Windows Programming
- python3.5 caffe(2017.8) cuda8.0 cudnn5.1 VS2015(windows)
- windows+cuda8.0+VS2015+matlab2017b+cudnn5.1安装配置Caffe
- Virtual Memory 转自维基百科(http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode)
- Windows10+CUDA8.0+VS2015+CUDNN5下配置caffe
- VS2015--win32工程配置的一些想法之算法min/max与windows中的 min/max宏冲突
- VS2010 win32项目windows窗体程序 向导生成代码解析
- 在Windows Mobile和Wince(Windows Embedded CE)下Win32项目加入ATL支持
- Intel中的“ring”机制 转自维基百科(http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode)
- VS2015--win32工程配置的一些想法之算法min/max与windows中的 min/max宏冲突
- windows10+cuda8.0+cudnn5.1+vs2013下编译caffe
- 用户模式 VS 内核模式 转自维基百科(http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode)
- Windows Dev Intro - VS2013 Compile X64 Project Upgraded from Win32 Project