Windows程序运行原理(总结)

写这个博客的目的仅仅是为自己编程学习过程中作一些总结,时不时来回顾,里面也有没搞明白的,希望在今后积累够后,回来看看能够豁然开朗


1、消息及消息队列:操作系统是将感知到的事件传递给应用程序。

操作系统给出了消息结构体MSG:  和哪一个窗口相关,消息本身是什么,消息的附加参数是什么,消息发生投递的时间是什么,消息投递时当前光标的位置

typedef struct tagMSG {       
    	HWND   hwnd;      
    	UINT   message; //用一个整数标示一个消息,定义了宏用来表示数字,如按键消息,鼠标左键下按 WM_LBUTTONDOWN这个宏来表示数字就比较好记忆,
    	WPARAM wParam;  //变量类型整数,指示消息的附加信息,具体的按键信息:如键盘按键的ASCIA码,获取具体字符
    	LPARAM lParam;  <span style="font-family: Arial, Helvetica, sans-serif;">//变量类型整数,指示消息的附加信息</span>
    	DWORD  time;   //32位整数,doubleWord
    	POINT  pt;     // 当信息别投递时,当前光标的位置,
} MSG; 

句柄(HANDLE),资源的标示,包括图标(HICON)、光标(HCurSOR)、窗口(HWND)、应用程序实例句柄(HINSTANCE)等

即给各种资源一个标示号,操作系统方便管理。

如HWND,是一个窗口句柄,操作系统通过这个句柄可以管理这个窗口的内容。操作系统是用句柄去索引的内存当中的资源。


2、每一个应用程序,操作系统都会为其建立一个消息队列,先进先出的缓冲区

3、Windows程序的入口函数

int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance   应用程序实例句柄,代表
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line       LP STR 指向字符串的指针        
  int nCmdShow              // show state
);

4、窗口创建

      a、设计一个窗口类;

      b、注册窗口类;

      c、创建窗口;

      d、显示及更新窗口



#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#pragma(lib, "MSVCRTD.lib");


LRESULT CALLBACK WinSunProc(HWND hwnd,      //窗口句柄
	UINT wMsg,       //message identifier
	WPARAM wParam,   // first message parameter
	LPARAM lParam);   //second message parameter



int WINAPI WinMain(HINSTANCE hInstance, //应用程序实例句柄
				   HINSTANCE hPrevInstance, //先前应用程序的句柄
				   LPSTR lpCmdLine,        //
				   int nCmdShow)
{
	//设计一个窗口类
	WNDCLASS wndcls;
	wndcls.cbClsExtra = 0;
	wndcls.cbWndExtra = 0;
	wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
	wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);
	wndcls.hIcon = LoadIcon(NULL,IDI_ERROR);
	wndcls.hInstance = hInstance;
	wndcls.lpfnWndProc = WinSunProc;
	
	
	//代码在VC6中没问题. 因为它的代码没有按可编译为UNICODE版本的方式写,而VS2005之后版本默认是UNICODE编码的.所以所有使用到字串的地方都会出错.
	//方法:修改VS2005之后版本的设置:选择你的项目->属性->常规->设置为不使用UNICODE,发现设置为多字节字符集也可以。发现用VS2005打开VC6的源代码,转换后是使用的多字节字符集。
	// 在VS2008,vs2010中,项目->属性->常规->字符集:改为“使用多字节字符集”即可
	//error C2440: “=”: 无法从“const char [11]”转换为“LPCWSTR”类问题
	
	wndcls.lpszClassName = "tranning";   //wndClass.lpszClassName =L"DIRECTX11BookWindowClass";即在字符串的前面添加一个大写L。这样可以实现将字符串转换为宽字符集。
	wndcls.lpszMenuName = NULL;
	wndcls.style = CS_HREDRAW | CS_VREDRAW;

	//注册窗口类
	RegisterClass(&wndcls);
	
	//创建一个窗口

	HWND hwnd;   //创建一个句柄,代表这窗口标识符 // DWORD dwStyle 窗口类型
	hwnd = CreateWindow("tranning", "仿生机器人实验室",WS_OVERLAPPEDWINDOW,
							0, 0, 600, 400, NULL, NULL, hInstance, NULL);
	//显示窗口
	ShowWindow(hwnd,SW_SHOWNORMAL);
	UpdateWindow(hwnd);

	//消息响应函数
	MSG msg;
	while (GetMessage(&msg,NULL,0,0))     //第二个参数句柄设置为空,希望获取所有函数的消息
	{
		TranslateMessage(&msg);    //消息转换,如将WM_KEYDOWN和WM_KEYUP转换成一个char 消息,并且投递到消息队列当中
		DispatchMessage(&msg);     //将收到的消息传递到窗口的回调函数,在窗口过程函数当中处理,理解为将消息送给操作系统再由操作系统去调用回调函数
	}
	return 0;
}

//窗口过程函数
//回调函数,
//CALLBACK 是标准调用约定_stdcall

LRESULT CALLBACK WinSunProc(HWND hwnd,      //窗口句柄
							UINT wMsg,       //message identifier
							WPARAM wParam,   // first message parameter
							LPARAM lParam)   //second message parameter
{
	switch(wMsg)
	{
	case WM_CHAR:
		char szChar[20];
		sprintf(szChar,"char is %d", wParam);
		break;
	case WM_LBUTTONDOWN:
		MessageBox(hwnd,"mouse clicked", "fangsheng",0);
		HDC hdc;            //device contacts , 提供这个接口,可以不用理会外设驱动怎么回事
		hdc = GetDC(hwnd);

		TextOut(hdc, 0, 50, "Windows程序设计基础", strlen("Windows程序设计基础"));
		ReleaseDC(hwnd,hdc);
		break;
	case WM_PAINT:    //窗口重绘函数
		HDC hdc1;
		PAINTSTRUCT ps;
		hdc1 = BeginPaint(hwnd,&ps);
		TextOut(hdc1, 0, 0, "程序设计基础", strlen("程序设计基础"));
		EndPaint(hwnd, &ps);
		break;
	case WM_CLOSE:
		if(IDYES == MessageBox(hwnd, "是否真的结束?","Windows程序设计基础",0))
		{
			DestroyWindow(hwnd);              //销毁窗口
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);        // 投递一个WM_QUIT的消息到线程的消息队列当中,并且立即返回    终止消息发送,式消息循环终止,从而实现退出程序
		break;
	default:
		return DefWindowProc(hwnd,wMsg,wParam,lParam);   //其它消息由操作系统默认处理
	}
	return 0;
}

运行时遇到问题:

1、//error C2440: “=”: 无法从“const char [11]”转换为“LPCWSTR”类问题代码在VC6中没问题. 因为它的代码没有按可编译为UNICODE版本的方式写,而VS2005之后版本默认是UNICODE编码的.所以所有使用到字串的地方都会出错.

//方法:修改VS2005之后版本的设置:选择你的项目->属性->常规->设置为不使用UNICODE,发现设置为多字节字符集也可以。发现用VS2005打开VC6的源代码,转换后是使用的多字节字符集。
// 在VS2008,vs2010中,项目->属性->常规->字符集:改为“使用多字节字符集”即可

2、MSVCRTD.lib(crtexe.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用

在项目属性-连接器-系统- 子系统 , 将:   /subsytem:console     改为/ subsystem:windows 至于为什么这么改,我就不是太清楚,

一开始在vs2010建立工程是默认控制台工程,我将里头main函数直接删除,并且输入以上代码,就出现这个问题。


_stdcall 与 cdcall 的区别
调用约定,一种是标准调用约定,一种是C语言的调用约定

定义的参数传递的顺序,还有堆栈清除有些差异

除了可变参数API 函数调用,其他都是_stdcall

VC++ 默认是cdcall,,在vc++调用_stdcall  API函数时必须在声明函数时,加入_stdcall标示

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在这个系列课程中,来自微软的权威技术专家将向您解释Windows操作系统的内部工作原理,从系统架构的大局观出发,逐步展示进程、线程、安全机制、内存管理和存储管理等子系统的工作方式。通过对底层原理的揭示,使您更进一步的理解Windows上各类程序的工作方式和如何进行错误诊断及性能优化。 本次课程的内容编排得到了国内知名技术作家,《Windows Internals》一书的中文译者,潘爱民先生的大力支持,同时TechNet也邀请到了众多微软一线技术专家进行讲解。这是一个为IT专业人员量身定做的Windows内部知识课程,在介绍原理的同时,也紧密地围绕实际案例和常见的故障进行分析点评。这是一个系统的学习Windows底层工作机制的好机会,课程内容深入浅出,精彩纷呈,绝对不容错过。 深入研究Windows内部原理系列之一:Windows的昨天、今天和明天 讲师信息:潘爱民 2007年01月25日 14:00-15:30 Level: 300 著名技术作家、微软亚洲研究院研究员潘爱民老师将在这次课程中跟听众分享Windows的发展历程和技术精萃,描绘操作系统的体系架构、Vista的内核变更以及今后版本Windows的发展趋势。 深入研究Windows内部原理系列之二:Windows体系结构-从操作系统的角度 讲师信息:张银奎 2007年01月26日 14:00-15:30 Level: 400 操作系统是计算机系统的灵魂和管理中心,也是软件系统中最复杂的部分。本讲座将以生动的讲解和丰富的演示带您领略Windows操作系统的核心架构和主要组件,包括HAL、内核、执行体、系统进程(IDLE、SMSS.EXE、WinLogon.EXE)和Windows子系统(CSRSS.EXE、WIN32K.SYS以及子系统DLL)等。并讨论中断管理、对象管理、和异常分发等系统机制和实现这些机制的基本数据结构。 深入研究Windows内部原理系列之三:Windows体系结构-从应用程序的角度 讲师信息:曾震宇 2007年01月29日 14:00-15:30 Level: 400 从服务器软件到Office办公应用,从联网游戏到即时消息,不管这些应用的复杂程度如何,他们都是一个个在操作系统控制和管理之下的可执行程序。本次课程邀请微软全球技术中心专家级工程师,为各位讲解一个程序是如何经历从启动、分配资源、运行、结束这一连串的过程,并且介绍其中的重要概念和排错诊断技巧。 深入研究Windows内部原理系列之四:Windows操作系统中的重要基本概念 讲师信息:高宇 2007年01月30日 14:00-15:30 Level: 400 进程、线程、资源分配、内存管理、Win32 API、服务、安全,这些是工作中常常提及但是又无法深入理解的神秘概念。在这次课程中,讲师将介绍Windows中最常见与最重要的一些基本概念. 使大家能够顺利地参与到本系列之后的讨论中去。 深入研究Windows内部原理系列之五:Windows Sysinternals工具集介绍 讲师信息:彭爱华 2007年01月31日 14:00-15:30 Level: 400 Sysinternals Suite(Windows Sysinternals工具集)包含一系列免费的系统工具,其中有大名鼎鼎的Process Explorer、FileMon、RegMon等(在Windows Vista下,FileMon和RegMon则被Process Monitor所代替),如果把系统管理员比喻成战士的话,那么Sysinternals Suite就是我们手中的良兵利器。熟悉和掌握这些工具,并且对Windows的体系有一定的了解,将大幅度的提高日常的诊断和排错能力。本课程将以任务驱动的模式,介绍几个经典的应用案例,来介绍Sysinternals Suite的强大功能。 深入研究Windows内部原理系列之六:Vista新特性底层揭秘 讲师信息:彭爱华 2007年02月01日 14:00-15:30 Level: 400 Windows Vista绝非仅仅是具有诸如3D切换、毛玻璃等炫目的界面效果,花钱购买了Windows Vista,而仅仅为了使用其界面效果,难免有点“买椟还珠”的感觉。实际上Windows Vista值得称道的是它具有很多全新的安全特性,例如用户帐户控制、IE保护模式、服务隔离和Windows资源保护等等。有了这些全新的安全特性,我们就可以在相当的程度上摆脱恶意软件的滋扰。Windows之父Jim Allchin曾经说过不要满足于只知道How-to、小技巧之类的知识,而是应该深入底层了解其内部原理。只有了解了这些安全特性的内在原理,才

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值