首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载 | ||
2012中考 | 2012高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试 MPA考试 | 中科院 |
||
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 托业 | 雅思 | 专四专八 | 口译笔译 | 博思 GRE GMAT | 新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 零起点法语 | 零起点德语 | 零起点韩语 |
||
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证 华为认证 | Java认证 |
||
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格 报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师 人力资源 | 管理咨询师 | 秘书资格 | 心理咨询师 | 出版专业资格 | 广告师职业水平 | 驾驶员 网络编辑 | 公共营养师 | 国际货运代理人 | 保险从业资格 | 电子商务师 | 普通话 | 企业培训师 营销师 |
||
卫生资格 | 执业医师 | 执业药师 | 执业护士 | ||
会计从业资格考试(会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师 注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师 |
||
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师 质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师 设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师 城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师 化工工程师 | 材料员 |
||
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏 |
Windows内部运行机制
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中函数定义的说明与区别解释。
__cdecl:这是编译器默认的函数调用转换方式,它可以处理可变参数的函数调用。参数的入栈顺序是从右向左。在函数运行结束后,由调用函数负责清理入栈的参数。在编译时,在每个函数前面加上下划线(_),没有函数名大小写的转换。即_functionname.每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。
__stdcall:函数参数从右向左入栈,被调用函数负责入栈参数的清理工作。函数名转换格式如下:_functionname@number.函数参数个数固定。
WINDOWS 的函数调用时需要用到栈( STACK ,一种先入后出的存储结构)。当函数调用完成后,栈需要清除,这里就是问题的关键,如何清除?
如果函数使用 _cdecl ,那么栈的清除工作是由调用者,用 COM 的术语来讲就是客户来完成的。这样带来了一个棘手的问题,不同的编译器产生栈的方式不尽相同,那么调用者能否正常的完成清除工作呢?答案是不能。
如果使用 __stdcall ,上面的问题就解决了,函数自己解决清除工作。所以,在跨(开发)平台的调用中,我们都使用 __stdcall (虽然有时是以 WINAPI 的样子出现)。
那么为什么还需要 _cdecl 呢?当我们遇到这样的函数如 fprintf() 它的参数是可变的,不定长的,被调用者事先无法知道参数的长度,事后的清除工作也无法正常的进行,因此,这种情况我们只能使用 _cdecl。
到这里有一个结论,如果你的程序中没有涉及可变参数,最好使用 __stdcall 关键字,我们创建一个Win32应用程序都是用的系统API函数,参数固定,所以都用__stdcall了。
设计窗口类、册窗口类、创建窗口、显示并更新窗口通常一起完成,MSDN中有详细的说明,可以根据一些默认参数修改窗口样式。在完成窗口的设计,创建更新后,需要创建一个消息循环。
MSG msg;
while(GetMessage(&msg,NULL,0,0))//消息循环
{
TranslateMessage(&msg);//将虚拟键值消息转化为字符消息,并将字符消息投递到消息队列中
DispatchMessage(&msg);//分派一个消息窗口,对消息进行处理
}
GetMessage函数接收到的消息除了WM_QUIT外都返回非零值。
消息响应函数对消息队列中的消息事件执行处理,在窗口初始化的时候将函数的指针提供给窗口,当事件发生的时候调用函数,消息响应函数在定义前必须在窗口注册,创建等过程前事先声明。
DC:Device Contex,是一个包含设备信息的结构体,这个地方的概念不大容易理解。
Windows创建了自己的命名约定,称之为匈牙利命名法,通常在变量前面加上一些前缀字符。
最后,把原书的代码抄一遍,虽然是照的书本写,过程中还是出了一些错误,好不容易才调试完。VC开发环境的提示功能几乎为零,god!
相关推荐:
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |