CSK.Blog--个人原创Weblog

« 也来说说我的设计作品即将告别FTTB+LAN和我现在的家 »

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? 其实相当简单: 注意那个
  • quote 2.blueice
  • 我是在PCSHOW上一篇争论中看到楼主的BLOG的,进来顺便看了看,关于第一个问题,其实不止能小到2K左右,还可以通过合并节,以及调整节长的方法进一步减少体积,在不使用动态库的情况下可以小到一两百个字节(或者是几十个字节,记不清了)左右。
  • 12/21/2005 9:10:22 PM 回复该留言
  • quote 3.JAY
  • http://eternity3.com.cn
  • 关于最有一点的那个'\r',如果下一次将输出的字符串长度小于当前的长度,则下一次的字符串输出的时候将不会完全覆盖前一次的输出。那么前一次的输出结果的部分会不会保留在输出设备上呢?
  • 8/19/2006 2:26:39 PM 回复该留言

发表评论:

注意:为了有效防止SPAM,任何含有http://字样的消息会被阻止发布同时,本站仅供技术交流,请不要讨论任何政治敏感话题或者低级趣味问题。

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)