1.3Windows操作系统

WIn32API函数:

  API(Application Programming Interface):应用程序编程接口。在windows程序设计发展的初期,Windows程序员能够使用的编程工具只有API函数。这些功能以函数库的形式组织在一起,形成了Windows应用编程接口,简称“Win API”。Win API子系统负责将API调用转换成Windows操作系统的系统服务调用。

  用于16位WIndows的API(Windows1.0~Windows3.1)称作“Win16”,用于32位Windows的API(Windows 9x/NT/2000/XP/7/10)称为“Win32”。64位Windows API的名称和功能基本没有变化,还是使用Win32的函数名,但是用64位代码实现。API函数调用在从win16到Win32的转变中保持兼容,并在数量和功能上不断增强。

  所有32位Windows都支持Win16API(以确保与旧的应用程序兼容)和Win32API(以运行新的应用程序)。在Windows NT/2000/xp/7中,Win16函数调用通过一个转换层转换为Win32函数调用,然后被操作系统处理。在Windows9x中,该操作正好相反。

  Windows运转的核心是动态链接。Windows提供了丰富的应用程序可利用的函数调用,这些函数采用动态链接库(DLL)实现。

  早期的动态链接库:

    Kernel(由KERNEL32.DLL实现):操作系统核心功能服务,包括进程与线程控制、内存管理、文件访问等。

    User(由USER32.DLL实现):负责处理用户接口,包括键盘和鼠标输入、窗口和菜单管理等。

    GDI(由GDI32.DLL实现):图形设备接口,允许程序在屏幕和打印机上显示文本和图形。

  在NT架构下,Win32 API能接受Unicode和ASCI两种字符集,而其内核只能使用Unicode字符集,字符串的转换需要占用系统资源。

  在Win32 API函数字符集中,“A”表示ASCII,“W”表示Widechars(即Unicode)。前者就是通常使用的单字节方式;后者是款字节方式,以便于处理双字节字符。

  ASCI版的应用程序需要更多的内存及更多的CPU资源,而UNicode版的程序在NT框架下的执行效率高了很多。

WOW64:

 WOW64(Windows-on-Windows 64-bit)是64位Windows操作系统的子系统,可以使大多数32位应用程序在不进行修改的情况下运行在64位操作系统上。

  64位应用程序会加载System32目录下64位的kernel32.dll、user32.dll和ntdll.dll。当32位应用程序加载时,WOW64建立32位ntdll.dll所要求的启动环境,将CPU模式切换至32位,并开始执行32位加载器,就如同该进程运行在原生的32位系统上 一样。WOW64会对32位ntdll.dll的调用重定向ntdll.dll(64位),而不是发出原来的32位系统调用指令。WOW64转换到原生的64位模式,捕获与系统调用有关的参数,发出对应的原生64位系统调用。当原生的系统调用返回时,WOW64在返回32位模式之前将所有输出参数从64位转换成32位。

  WOW64既不支持16位应用程序的执行(32位Windows支持16位应用程序的执行),也不支持加载32位内核模式的设备驱动程序。WOW64进程只能加载32位的DLL,不能加载原生的64位DLL。类似的,原生的64位进程不能加载32位的DLL。

Windows消息机制:

 Windows是一个消息(Message)驱动式系统。Windows消息提供在应用程序与应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息触发,通过对消息的响应和处理完成。

  Windows系统中有两种消息队列:一种是系统消息队列;另一种是应用程序消息队列。计算机的所有输入设备由Windows监控。当一个事件发生时,Windows先将输入的消息放入系统消息队列,再将输入的消息复制到相应的应用程序队列中,应用程序中的消息循环在它的消息队列中检索每个消息并发送给相应的窗口函数。

  一些常见的Windows消息函数:

    1.SendMessage函数

      调用一个窗口的窗口函数,将一条消息发送给那个窗口。除非消息处理完毕,否则该函数不会返回。

LRESULT SendMessage(
      HWND hWnd,             //目的窗口的句柄
      UINT  Msg,              //消息标识符
      WPARAM wParam,      //消息的WPARAM域  
      LPARAM lParam,       //消息的LPARAM域                                 
);

      返回值:由具体的消息决定。如果消息投递成功,则返回“TRUE”(非零)

    2.WM_COMMAND消息

      当用户从菜单或按钮中选择一条命令或者一个控件时该消息被发送给它的父窗口,或者当一个快捷键被释放时发送。

  

WM_COMMAND
    wNotifyCode = HIWORD(wParam);        //通告代码
    wID = LOWORD(wParam);                   //菜单条目、控件或快捷键的标识符
    hwndCtl = (HWND) lParam;                 //控件句柄

      返回值:如果应用程序处理这条消息,则返回值为零。

    3.WM_DESTROY消息

      当一个窗口被销毁时发送该消息。该消息的十六进制数是02h,没有参数。

      返回值:如果应用程序处理这条消息,则返回值为零。

    4.WM_GETTEXT消息

      应用程序发送一条WM_GETTEXT消息。将一个对应窗口的文本复制到一个由呼叫程序提供的缓冲区中。

  

WM_GETTEXT
    wParam = (WPARAM) cchTextMax;    //需要复制的字符数
    lParam = (LPARAM)lpszText;        //接收文本的缓冲区地址

      返回值:被复制的字符数

    5.WM_QUIT消息

      当应用程序调用PostQuitMessage函数时,生成WM_QUIT消息。

WM_QUIT
    nExitCode = (int) wParam;        //退出代码

      返回值:没有

    6.WM_LBUTTONDOWN消息

      当光标停在一个窗口的客户区且用户按下鼠标左键时,VM_LBUTTONDOWN消息将被发送。如果鼠标动作未被捕获,这条消息将会被发送给光标下的窗口;否则,将被发送给已经捕获鼠标动作的窗口。

WM_LBUTTONDOWN
    fwKeys = wParam;    //key旗标
    xPos = LOWORD(lParam);    //光标的水平位置
    yPos = HIWORD(lParam);    //光标的垂直位置

      返回值:如果应用程序处理了这条消息,则返回值为零。·

虚拟内存:

  ·应用程序不会直接访问物理地址

  ·虚拟内存管理器通过虚拟地址的访问请求来控制所有的物理地址访问

  ·每个应用程序都有独立的4GB寻址空间,不同应用程序的地址空间是彼此隔离的。

  ·DLL程序没有“私有”空间,它们总是被映射到其他应用程序的地址空间中,作为其他应用程序的一部分运行。

  使用虚拟内存的好处:

    简化了内存管理,弥补了物理地址的不足,可以防止多任务环境下应用程序之间的冲突。

  

猜你喜欢

转载自www.cnblogs.com/namecannotfind/p/10092516.html
今日推荐