Windows图形编程 中的一个例程所引发的收获和思考

               

作者:朱金灿
来源:http://blog.csdn.net/clever101/


       袁峰大侠著的《Windows图形编程》是一本学习《Windows图形编程》的好书。书中的第二个例程值得探究。第二个例程的代码如下:

//-----------------------------------------------------------------------------------////              Windows Graphics Programming: Win32 GDI and DirectDraw               ////                             ISBN  0-13-086985-6                                   ////                                                                                   ////  Written            by  Yuan, Feng                             www.fengyuan.com   ////  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         ////  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      ////                                                                                   ////  FileName   : hello2.cpp                                           ////  Description: Hellow World Demo 2, full screen display, Chapter 1                 ////  Version    : 1.00.001, July 26, 2000                                             ////-----------------------------------------------------------------------------------////#define STRICT//#define WIN32_LEAN_AND_MEAN#include <windows.h>#include <tchar.h>#include <assert.h>void CenterText(HDC hDC, int x, int y, LPCTSTR szFace, LPCTSTR szMessage, int point){ HFONT hFont = CreateFont(- point * GetDeviceCaps(hDC, LOGPIXELSY) / 72,  0, 0, 0, FW_BOLD, TRUE, FALSE, FALSE,   ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,   PROOF_QUALITY, VARIABLE_PITCH, szFace); //  assert(hFont); HGDIOBJ hOld = SelectObject(hDC, hFont);    // 设置 SetTextAlign(hDC, TA_CENTER | TA_BASELINE); SetBkMode(hDC, TRANSPARENT); SetTextColor(hDC, RGB(255,0,0)); TextOut(hDC, x, y, szMessage, _tcslen(szMessage)); SelectObject(hDC, hOld); DeleteObject(hFont);}const TCHAR szMessage[] = _T("Hello, World");const TCHAR szFace[]    = _T("Times New Roman");#pragma comment(linker, "-merge:.rdata=.text")#pragma comment(linker, "-align:512")extern "C" void WinMainCRTStartup(){ // 获取屏幕DC HDC hDC = GetDC(NULL); // 在屏幕中央绘制 CenterText(hDC, GetSystemMetrics(SM_CXSCREEN) / 2,  GetSystemMetrics(SM_CYSCREEN) / 2,  szFace, szMessage, 72); ReleaseDC(NULL, hDC); ExitProcess(0);} 



     我使用VS C++ 2005(带sp1)建一个Win32应用程序的空工程--Hello2,新建一个Hello2.cpp,把上面的代码敲进去,生成Hello2.exe,调试运行被告知无法启动Hello2.exe,双击Hello2.exe被提示Hello2.exe不是有效的Win32程序,于是上网搜资料,发帖提问。VC知识库的杨大侠告知:


      /ALIGN 选项指定程序线性地址空间中每一节的对齐方式。number 参数以字节为单位,并且必须是 2 的幂。默认值是 4K (4096)。如果对齐方式产生无效的图像,则链接器发出警告。

除非正在编写诸如设备驱动程序的应用程序,否则应不需要修改对齐方式。

可以用 /SECTION 选项的对齐参数修改特定节的对齐方式。

指定的对齐值不能小于最大的节对齐。


          按照杨大侠的说法,/ALIGN 选项参数的最小值应为1024,于是我试着把#pragma comment(linker, "-align:512")改为#pragma comment(linker, "-align:1024"),结果真能运行起来。#pragma comment(linker, "-merge:.rdata=.text")和#pragma comment(linker, "-align:512")这两句代码的作用应该是为了减少生成的二进制文件的大小。



     另外这个例程的代码在VC 6.0是可以运行的,也就是说VC 6.0可以接受#pragma comment(linker, "-align:512"),不过工程设置方面需要作如下设置:


C++选项卡下的Project Optons下输入如下设置:
/nologo /MLd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /Fo"Debug/" /Fd"Debug/" /FD /c


Link选项卡下的Project Optons下输入如下设置:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug/Hello2.pdb" /map:"Debug/Hello2.map" /debug /machine:I386 /out:"Debug/Hello2.exe" /pdbtype:sept


         另外运行VC 6.0生成的exe文件可能会被杀毒软件误报为病毒(我的小红伞杀毒软件就是这样提示),估计这是杀毒软件以为该exe文件是病毒所致,这时选择忽略即可。




           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/gdruhv/article/details/87627161
今日推荐