2005-12-17 2:19:37
Win32编程经验
呵呵,其实也不是什么原创的东西。只是拿出来和大家分享^_^
第一回
1.如何减小程序尺寸
有没有发现如下短短的代码用VC编译出来的Release版也要46kb呢?
而如果你用MASM写换等效的汇编只有2kb左右。虽然我们可以用AsPack或者UPX加壳,但如果本来程序就能控制的很小岂不更好?
那我们先来分析一下为什么会那么大呢?
首先作为高级语言肯定会有runtime支持的,而VC的运行库就是MSVCRT.Lib。一般情况下(VC6和VC.net2003)VC会把运行库一起编译进程序里。但我们知道运行库除了进行过程检查外最大的空间就是被运行库函数占用的,比较那些printf\strlen之类的。但作为win32程序完全可以直接去调用API的,就上上面那段程序。但你又不可能把运行库移出程序。所以下面有2个办法:
a.采用外部dll。即在编译成obj前打上/ML开关,ML表示Mutithread Runtime Dll,而VC默认的是Mutithread Runtime Lib(在VC.net 2005中颠倒)。这样程序体积可以很容易的减小,即使你用纯C/C++库函数编写程序也是如此。
但缺点是如果对方机器没有MSVCRT.dll这个文件那就完了:_(,同时VS.net2005使用的是MSVCR80.dll这个dll,还采用meta技术控制版本,所以有一定局限。
b.采用入口点重定向,一般来说Vc编译的程序实际上不是从main或WinMain直接运行的,而是先初始化运行库,但我们编写的win32程序如果完全采用API的话那就没有必要了。所以我们可以完全让入口点设为WinMain。
简单的办法是加上连接器指令:
对于console程序是:
对于unicode程序则分别在各自主函数前面加上"w"。比如:
呵呵,你有没有想到,其实主函数可以不用一定取名为WinMain或者main了!
当然这也有个缺点,那就是要求程序不能使用库函数,否则效果不大。
经过上述参数,便以出来的程序在2k左右。
2.如何删除程序本身和正在运行的程序
其实不算删除,只是移位。但对付病毒和流氓软件足矣!
代码参考至xFocus,对那位作者表示感谢
3.如何变出在一行上显示比如"正在计算:80%完成"的console?
其实相当简单:
注意那个