作者:朱金灿
来源:http://blog.csdn.net/clever101/
袁峰大侠著的《Windows图形编程》是一本学习《Windows图形编程》的好书。书中的第二个例程值得探究。第二个例程的代码如下:
我使用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文件是病毒所致,这时选择忽略即可。