您的位置:首页 > 其它

Windows程序内部运行机制学习

2016-01-07 15:00 288 查看
对于WINDOWS程序的内部运行机制,主要学习知识点如下。

1.MSDN 的全称是 Microsoft Developer Network。这是微软公司面向软件开发者的一种信息服务。MSDN 实际上是一个以

Visual Studio 和 Windows 平台为核心整合的开发虚拟社区,包括技术文档、在线电子教程、网络虚拟实验室、微软产品下载(几乎全部的操作系统、服务器程序、应用程序和开发程序的正式版和测试版,还包括各种驱动程序开发包和软件开发包)、Blog、BBS、MSDN
WebCast、与 CMP 合作的 MSDN 杂志等等一系列服务。

用户接触到的最多关于 MSDN 的信息可能是来自于 MSDN Library。MSDN Library 就是通常人们眼中的 MSDN,涵盖了微软全套可开发产品线的技术开发文档和科技文献(部分包括源代码),也包括过刊的 MSDN 杂志节选和部分经典书籍的节选章节。MSDN Library 有 1.8 GB 左右。

2.MSG结构是操作系统通过消息机制将感知到事件传递给应用程序的,操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序.

typedef struct tagMSG {

HWND hwnd; //这个消息所在的窗口句柄

UINT message; //消息标识符,如WM_SIZE、WM_COMMAND、WM_QUIT等等

WPARAM wParam; //32位消息的特定附加信息

LPARAM lParam; // 32位消息的特定附加信息

DWORD time; // /消息创建时的时间

POINT pt; //消息创建时的鼠标位置

} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;

3.WinMain是一个函数,该函数的功能是被系统调用,作为一个32位应用程序的入口点。WinMain函数应初始化应用程序,显示主窗口,进入一个消息接收一发送循环,这个循环是应用程序执行的其余部分的顶级控制结构。

int WINAPI WinMain(HINSTANCE hInstance, //程序当前实例的句柄,以后随时可以用GetModuleHandle(0)来获得

HINSTANCE hPrevInstance, //这个参数在Win32环境下总是0,已经废弃不用了

char * lpCmdLine, //指向以/0结尾的命令行,不包括EXE本身的文件名,

//以后随时可以用GetCommandLine()来获取完整的命令行

int nCmdShow //指明应该以什么方式显示主窗口

);

4.WNDCLASS是一个由系统支持的结构,用来储存某一类窗口的信息,如ClassStyle,消息处理函数,Icon,Cursor,背景Brush等。也就是说,CreateWindow只是将某个WNDCLASS定义的窗体变成实例。

typedef struct _WNDCLASS {
UINT style;// 窗口类型
WNDPROC lpfnWndProc;//窗口处理函数
int cbClsExtra;//窗口扩展
int cbWndExtra;//窗口实例扩展
HINSTANCE hInstance;//实例句柄
HICON hIcon;//窗口的最小化图标
HCURSOR hCursor;//窗口鼠标光标
HBRUSH hbrBackground;//窗口背景色
LPCTSTR lpszMenuName;//窗口菜单
LPCTSTR lpszClassName;// 窗口类名
} WNDCLASS, *LPWNDCLASS;

5.在注册完窗口类后就需要进行窗口的创建,用到的函数理所当然就是CreateWindow(), 而这个函数是基于窗口类的,所以还需要指定几个参数来制定特定的窗口。

API 函数原型:

HWND WINAPI CreateWindow(

_In_opt_ LPCTSTR lpClassName, // 窗口类名称

_In_opt_ LPCTSTR lpWindowName, // 窗口标题

_In_ DWORD dwStyle, // 窗口风格,或称窗口格式

_In_ int x, // 初始 x 坐标

_In_ int y, // 初始 y 坐标

_In_ int nWidth, // 初始 x 方向尺寸

_In_ int nHeight, // 初始 y 方向尺寸

_In_opt_ HWND hWndParent, // 父窗口句柄

_In_opt_ HMENU hMenu, // 窗口菜单句柄

_In_opt_ HINSTANCE hInstance, // 程序实例句柄

_In_opt_ LPVOID lpParam // 创建参数

);

注:_In_ 说明该参数是输入的,_opt_ 说明该参数是可选参数(不是说没有参数,而是可以利用宏搭配参数)。

返回值: 如果函数成功,返回值为新窗口的句柄。 如果函数失败,返回值为 NULL。

6.函数GetMessage 是 从调用线程的消息队列里取得一个消息并将其放于指定的结构。此函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息。此函数接收一定范围的消息值。GetMessage不接收属于其他线程或应用程序的消息。获取消息成功后,线程将从消息队列中删除该消息。函数会一直等待直到有消息到来才有返回值。

BOOL GetMessage(
LPMSG lpMsg, // address of structure with message
HWND hWnd, // handle of window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax // last message
);
GetMessage函数接收到除WM_QUIT外的消息均返回非零值。对于WM_QUIT消息,该函数返回零。如果出现了错误,该函数返回-1,例如,当参数hWnd是无效的窗口句柄或lpMsg是无效的指针时。

7.WindowProc是一个应用程序定义的函数。它处理发送给窗口的消息。WINDPROC类型定义了一个指向该回调函数的指针。WindowProc是用于应用程序定义函数的占位符。

函数原型:
LRESULT CALLBACK WindowProc (HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
参数:
hwnd:指向窗口的句柄。
uMsg:指定消息类型。
wParam:指定其余的、消息特定的信息。该参数的内容与UMsg参数值有关。
IParam:指定其余的、消息特定的信息。该参数的内容与uMsg参数值有关。
返回值:返回值就是消息处理结果,它与发送的消息有关。

8.Win32asm源程序风格采用匈牙利表示法,是由Microsoft公司的程序设计人员Charles Simonyi首创的。在匈牙利表示法中,变量名以一个或多个小写字母开始,代表变量的类型。后面附以变量的名字,变量名以意义明确的大小写混合字母序列所构成。这种方案允许每个变量都附有表征变量类型的信息。如:WORD
wParam1;LONG lParam2;HANDLE hInstance。其优点:通过给每个变量名加上表示所属数据类型的前缀,从而在编译前即可防止许多常见的错误。
前缀隐含的数据类型说明
b
BOOL实际为整型
byBYTE无符号字符
cchar字符
dwDWORD无符号长型
fnfunction函数
hHANDLE无符号整型
iinteger整数
lLONG长型
lpLong pointer远指针
nShort(integer)整型
npNear pointer近指针
ppointer指针
s
string字符串
szZero terminated string以0结尾的字符串
wWORD整数或字
x,yshortX坐标和y坐标
cx,cyshortx方向长和y方向长,c代表count(量度)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: