Learning WTL8.0 Part-1 Win32 vs. ATL Windows Programming(2)

原创 2007年09月21日 19:39:00
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中的:
// Windows Header Files:
#include <windows.h>
 
// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
 
并在stdafx.h中添加如下的include语句:
 
#include <atlbase.h>
extern CComModule _Module;
#include <atlcom.h>
#include <atlwin.h>
#include "CWellcomeWindow.h"
 
2.2 添加CWellcomeWindow.h
#pragma once
#include "stdafx.h"
 
class CWellcomeWindow : public CWindowImpl<CWellcomeWindow,
      CWindow, CFrameWinTraits> {
public:
      DECLARE_WND_CLASS(NULL);
 
      BEGIN_MSG_MAP(CWellcomeWindow)
            MESSAGE_HANDLER(WM_CREATE, OnCreate)
            MESSAGE_HANDLER(WM_PAINT, OnPaint)
            MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
      END_MSG_MAP()
 
      LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
      {
            HICON appIcon = LoadIcon(_Module.GetResourceInstance(),
                  MAKEINTRESOURCE(IDI_LEARNINGWTLPART1_ATL));
            this->SetIcon(appIcon);
 
            return 0;
      }
 
 
      LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
      {
            PAINTSTRUCT ps;
            CComBSTR wellcome(_T("Hello World!"));
 
            HDC hdc; // = this->GetDC();
 
            hdc = this->BeginPaint(&ps); // this->BeginPaint(&ps);
                  TextOut(hdc, 0, 0, wellcome, wellcome.Length());
            this->EndPaint(&ps);
            //this->ReleaseDC(hdc);
 
            return 0;
      }
 
      LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
      {
            ::PostQuitMessage(0);
 
            return 0;
      }
};
2.3 修改win32.cpp
保留WinMain方法声明和#include "stdafx.h"语句将其余代码删除或注释掉。添加_Module定义,修改WndMain方法体;完成后的代码如下:
#include "stdafx.h"
#include "LearningWTLPart1_ATL.h"
 
CComModule _Module;
 
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
      UNREFERENCED_PARAMETER(hPrevInstance);
      UNREFERENCED_PARAMETER(lpCmdLine);
 
      _Module.Init(NULL, hInstance);
 
      CComBSTR appTitle;
      appTitle.LoadString(_Module.GetResourceInstance(), IDS_APP_TITLE);
 
      CWellcomeWindow wnd;
      wnd.Create(NULL, 0, appTitle);
 
      // Main message loop:
      MSG msg;
      while (GetMessage(&msg, NULL, 0, 0))
      {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
 
      }
 
      _Module.Term();
 
      return (int) msg.wParam;
}
 
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均采用编译器默认设置。
 
 
Debug
Release
比重
Win32版
100K
68K
 
ATL版
244K
88K
D244% | R129%
 
ATL版的Release,无论是物理文件大小还是运行时空间大小或运行效率都与Win32版的Release接近,且二者除系统库外,基本上不需要其它支持库(可能msvcrt.dll,gdi32.dll等)。
 

faster-rcnn(matlab版)在windows平台上的配置

VS2013+cuda8.0+matlab编译faster-rcnn
  • ChuQiDeCha
  • ChuQiDeCha
  • 2017年02月21日 19:18
  • 2972

李宏毅机器学习笔记

转自:http://blog.csdn.net/soulmeetliang/article/details/73251790 [机器学习入门] 李宏毅机器学习笔记-13 (Semi-...
  • hhsh49
  • hhsh49
  • 2017年11月02日 19:40
  • 90

如何用ATL编写Windows服务

有时候,我们需要自己写的程序在没有用户登陆的情况下,只要Windows系统启动就运行,那我们可以把我们的程序写成一个Windows服务。   服务是能够为各种用户(包括本地用户和远程用户)所用的,拥...
  • lsrwan
  • lsrwan
  • 2014年11月15日 22:17
  • 372

STL,ATL,WTL之间的联系和区别

一、STL即 Standard Template Library (标准模板库)       STL是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Le...
  • wangwenjing90
  • wangwenjing90
  • 2013年05月14日 14:44
  • 3966

VS2010 ATL服务程序编写全攻略(一) - 建立ATL服务

网上有很多关于编写ATL服务程序的代码和文章,但多数仍使用Visual C++ 6.0的ATL服务程序框架。对于XP系统,Visual C++ 6.0提供的框架能够正常工作,但对于Vista、Wind...
  • sonsie007
  • sonsie007
  • 2013年04月22日 15:06
  • 7265

用 VC 2008 编写 Windows Service(系统服务) atl 编写系统服务

http://hi.baidu.com/lewutian/item/9019396a05d517166995e6a5 http://hi.baidu.com/cntrump/item/2bf6b43...
  • smallnew198705
  • smallnew198705
  • 2014年03月30日 16:27
  • 1472

ROS系列一之Robot发展史

一.前言 二.概念 1920年,捷克作家卡尔·恰彼克写了一个剧本《罗素姆万能机器人》,剧本描写了一个依赖机器人的社会,戏剧中有一个长得像人,动作也像人的机器人——罗伯特(Robot,捷克语意为“强迫...
  • ad3600
  • ad3600
  • 2017年01月19日 16:30
  • 611

WinCE7.0 Win32智能设备项目使用 CString 的问题

建 了一个 WinCE 7.0 的 Win32 智能设备项目,在项目中增加了一些 .cpp 和 .h 文件。先是编译时出现 CString 未定义的错误,于是 #include "atlstr.h"。...
  • 91program
  • 91program
  • 2015年03月09日 07:41
  • 1591

Linux有问必答:如何在Linux上检查SSH的版本

原文: http://ask.xmodulo.com/check-ssh-protocol-version-linux.html 译文: LCTT http://linux.cn/arti...
  • robertsong2004
  • robertsong2004
  • 2015年01月05日 16:52
  • 1566

caffe 训练自己的数据集—调试技巧篇

调试caffe,用已有的网络训练自己的数据集的时候(我这里做的是二分类)。在生成均值文件之后,开始train,发现出现了这个问题。 1,路径正确,却读不到图片。 [db_lmdb.hpp:1...
  • dongfang1984
  • dongfang1984
  • 2016年11月21日 14:42
  • 7701
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Learning WTL8.0 Part-1 Win32 vs. ATL Windows Programming(2)
举报原因:
原因补充:

(最多只允许输入30个字)