《VC++深入详解–学习笔记》(1)Windows 内部运行机制

Filed Under (VC++ 学习笔记) by panmaoru on 30-11-2009

Windos系统提供了各种各样的函数,这些函数是windows操作系统提供给应用程序的接口 Application Progress Interface,所有主要的windows函数都在Windows.h头文件中进行了声明。

Win32 SDK(Soft Development Kit)是Windows 32平台下的软件开发包,包括API函数,帮助文档和一些辅助开发工具。

Windows是基于消息机制的,消息分标准消息,命令消息和通告消息。Windows程序中的消息又分进队消息和不进队消息,两种消息都由消息响应函数进行处理。

在VC中创建一个win32应用程序的大概流程如下:

  • 编写WinMain函数
  • 设计窗口类(WNDCLASS);
  • 注册窗口类(RegisterClass);
  • 创建窗口(CreateWindow);
  • 显示并更新窗口(ShowWindow|UpdateWindow);
  • 编写消息循环;
  • 编写窗口过程函数。

一个WinMain函数的原型如下:

int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
 int nCmdShow              // show state
);

此处WINAPI是一个_stdcall宏定义,VC有很多宏定义,这个很让人头大,需要慢慢去习惯,从网络上找了2中函数定义的说明与区别解释。

  1. __cdecl:这是编译器默认的函数调用转换方式,它可以处理可变参数的函数调用。参数的入栈顺序是从右向左。在函数运行结束后,由调用函数负责清理入栈的参数。在编译时,在每个函数前面加上下划线(_),没有函数名大小写的转换。即_functionname。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。
  2. __stdcall:函数参数从右向左入栈,被调用函数负责入栈参数的清理工作。函数名转换格式如下:_functionname@number。函数参数个数固定。

WINDOWS 的函数调用时需要用到栈( STACK ,一种先入后出的存储结构)。当函数调用完成后,栈需要清除,这里就是问题的关键,如何清除?

如果函数使用 _cdecl ,那么栈的清除工作是由调用者,用 COM 的术语来讲就是客户来完成的。这样带来了一个棘手的问题,不同的编译器产生栈的方式不尽相同,那么调用者能否正常的完成清除工作呢?答案是不能。

如果使用 __stdcall ,上面的问题就解决了,函数自己解决清除工作。所以,在跨(开发)平台的调用中,我们都使用 __stdcall (虽然有时是以 WINAPI 的样子出现)。

那么为什么还需要 _cdecl 呢?当我们遇到这样的函数如 fprintf() 它的参数是可变的,不定长的,被调用者事先无法知道参数的长度,事后的清除工作也无法正常的进行,因此,这种情况我们只能使用 _cdecl 。

到这里有一个结论,如果你的程序中没有涉及可变参数,最好使用 __stdcall 关键字,我们创建一个Win32应用程序都是用的系统API函数,参数固定,所以都用__stdcall了。

沉思录

Filed Under (随网心情) by panmaoru on 27-11-2009

一个月了,感恩节附近,又是月底,本应该做月终小结之类的报告,思考了一下,并没有什么可说的,关键是兴致提不起来,干脆就零零散散写下来吧,感觉到疲倦了就点发布键。

前段时间看到ZZF的QQ签名写着”三年了,一事无成“,心里愕然一震,他是在说我。

这段时间常把过去的事情一件件翻出来,然后在脑海中虚构2个自己,一个指着另外一个说:这件事情,你做错了,可常又不免在转瞬之间做错另外一件事情。

话题有些沉重,说说工作的事情。

————————————————————————————————

公司做的是加拿大的(asp.net)网站外包,和国内的零零散散的做网站的团队没有太大区别。

一个月过去了,四个人的团队完成了公司的网站(无后台功能版),心态上的变化应该是这样的”惊讶>崩溃>习惯“,这份工作也坚定了我一个信念:这是我最后一份asp.net工作。

四周的时间,基本上都是在重复着已经厌倦的流程:做页面,写样式表。如果说收获,可能工作前两天研究了一些以前一直觉得先进的三层开发模式吧,且乘着热度完成了公司网站基础的实体类,数据逻辑层,业务逻辑层代码。今天得到消息,老板建议基于开源的cms基础作修改开发,便于产品化。也好,就这样吧,反正我已全无兴趣。

大四上学期的时候一个同学常在我面前炫耀他css写的有多好,学的多优秀,这件事刺激了我,于是寒假在家期间,一个人楞生生的把 sohu,sina,163三大门户网站的首页用css+xhtml写了一遍,然后心里暗暗叫嚣,这算什么嘛!之后,他便很少和我讨论css结构等等了。大学毕业找工作的时候,那三个所谓web标准化架构的作品让我得到了163,qq,ctrip等不错的网络公司的面试机会,我常哭笑不得大学毕业之后维持我谋生的不是科班的c++,数据结构,数据库,操作系统,组合数学等专业知识技能,而是无心插柳般学会的一门算不上语言或我一直不知道怎么该给它归类的东西。

大二的时候认识了学校做asp.net的几个学长,然后傻傻的认为这是这个世界上最有前途的开发技术,于是乎,从幼儿园到教务处,一个网站接一个网站的做着,熟练到是很熟练,却很少去思考更深入的东西。从05年初开始第一次动手做网站,到09年的现在,很少思考,或思考的很肤浅,知其然而不知其所以然。

04年初,大一下学期,学院开了c++课程,逃课,玩游戏是那段大学时光的主旋律,上机实验课的时候也多是玩游戏,看毛片消磨掉的。我常为此事纠结,难以释怀,工作的时候,我也常因为此事很不自信,心虚。虚度那段时光之后,我逃避了很多与之相关的事情,结果,大学四年我没学会一门真正的程序设计语言(html除外)。当自信的说我理解了面向对象的思想概念,已是毕业2年之后,就像我很喜欢的那部叫《肖申克的救赎》的电影中所阐述的那样吧,那个懵懂的孩子的过错已经弥补了。

偶尔会问自己:你现在最需要的是什么?答:一个肯定自己机会。这个机会也只有我自己能给。

牢记:付出,努力,执着,走过眼前的荆棘小路,牛B的大道就在前方。

心态与状态

Filed Under (随网心情) by panmaoru on 19-11-2009

心态

  • 茫茫人海,一眼望去,我是最穷的一个。
  • 加把劲,脱贫致富奔小康。
  • 多在意些在意你的人,如此类推,多关心些关心你的人。
  • 持之以恒,精神会在物质之前富裕起来。

状态

  • 工作:老老实实完成份内之事,尽量不偷懒。此外坚持四项基本原则:不迟到,不早退,不旷工,不加班。
  • 学习:每天坚持看2个小时视频材料,尽量从工作和休息时间挤一个小时看相关文档并完成代码。
  • 抽烟:一天一包->三天一包->一周一包,继续努力,创造无烟生活。

关于博客搬家

Filed Under (博客聚合) by panmaoru on 02-11-2009

Colsir.com搬到国外已经一个星期了,运行平稳,在此称赞一下WordPress:功能完善,模板丰富以及大无畏的开源思想。Colsir之前的asp.Net程序是自己开发的,从第一版本开始就落下很多毛病,一直到当机也没解决,因为年前的小冲动跑到hostmonster买了台虚拟主机,这次smoile的服务器aspx配置出了问题之后才狠下心:搬家。

去年国庆的是很xena让我给他写一个WordPress的辅助程序,当时在网上看了一些关于Metaweblog api的文章,自己参照着示例做实验的时候遇到了一个很繁琐的异常处理问题没能解决,后来接了个OA的项目,就把这件事情耽搁了。前段时间这件事情又被提起来,便认真的看了下ZJ那篇 使用Windows Live Spaces MetaWeblog API 的文章,自己写了个小程序把colsir.com文章搬了出来。

Colsir原先的数据库是Access的,逐条从数据库读日志信息,然后用MS的Windows Live Spaces MetaWeblog API,将日志写入到WordPress中。搬之前查了下MetaWeblog API的结构,只有日志和分类的的接口,于是不得不放弃原先的评论信息,遗憾的很。

readonly M_MetaWeblog m_blog = new M_MetaWeblog ();
m_blog.Url ="http://www.colsir.com/xmlrpc.php ";
Post newPost = new Post ();
//做个循环,开始发布日志
newPost.dateCreated = "时间";//时间格式
newPost.title = "标题";
newPost.description = "内容";
newPost.categories = new[] { "C1", "C2" };
m_blog.newPost ( "_blogid", "UserName", "PWD", newPost, true );

40多篇文章,大概几秒钟就发布完成了,速度极其快。目前已经有不少离线发布blog的工具软件,好多BSP也公开了API,有一个泛滥的时代啊!

今天上午看了一些Post/Get机制的文章,回头再看看MetaWeblog API的消息结构,貌似原理上相通的很,想在网络这行混,HTTP协议得恶补。