Windows程序内部运行机制学习

对于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(量度)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值