zoukankan      html  css  js  c++  java
  • 《深入浅出MFC》第一章 Win32基本程序概念

    Win32基本程序设计原理也就是所谓的SDK程序设计原理。

    一个完整的windows可执行文件,通过链接器链接编译过的资源文件与编译过的代码文件而生成。资源文件通过描述文件.rs描述,通过编译器编译为.res文件。

    动态链接,是指程序所调用的windows api是在执行时期才链接上的,但是在链接时期,链接器仍然需要一些适当的信息使在执行期间能顺利的跳转到dll中并且在动态链接库未加载时知道该加载dll。这些适当的信息就保存在所谓的import函数库,以.LIB结尾。

    Windows程序调用的函数分为C Runtimes和Windows API两大部分。

    所有Windows程序都必须载入WINDOWS.h头文件。

    以消息为基础的事件驱动系统,通过循环不断获得消息,然后根据消息类型或种类处理消息。接受并处理消息的主角就时窗口,每个窗口都有一个函数处理消息,这个函数称为窗口函数(window procedure或window function)。

    WinMain函数是windows程序的进入点。CALLBACK是一种函数调用习惯,其他函数调用习惯还有_cdecl。

    通过调用windows api函数注册窗口类和创建窗口。通过调用ShowWindow显示窗口,通过调用UpdateWindow给窗口传递WM_PAINT消息。

     通过在WinMain循环中调用GetMessage不断获取消息,通过TranslateMessage和DispatchMessage转化和分派消息达到消息循环。

    DispatchMessage把消息送到当前窗口的窗口函数中,窗口函数是被windows系统所调用的。窗口函数的原型是一致的,必然是LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam, LPARAM lParam)。注意无论是什么消息都必须被处理,对窗口不感兴趣的消息调用DefWindowProc。

    通过设计消息映射表格的数据结构把消息与处理函数一一对应的写入表格,每当增加新的消息映射时只需要在表格中添加一条记录,这样可以使窗口函数保持稳定而不用改变。

    对话框分为Modal和Modeless两类对话框。一个对话框一定包含两样东西,对话框模板,定义在RC文件中用来说明对话框外貌、字形、大小、控件、控件位置等。对话框函数,用来处理消息,对话框处理过消息后应返回true,否则返回false,当返回false时,系统将使用默认的对话框处理函数处理该消息。

    模块定义文件,.DEF,用来指明模块名称,程序段与数据段内存特征,堆栈大小与callback函数列表等,集成开发环境会自动设置模块定义文件。

    资源描述文件RC文件是一个以文字描述资源的地方,包括字体,图标,文字,对话框等,资源描述文件必须通过RC编译器编译为二进制后才能通过链接器包含到执行程序中。

    程序初始化过程中调用CreateWindow,窗口创建后会生成WM_CREATE消息。消息循环通过GetMessage不断抓取消息,如果消息时WM_QUIT,则GetMessage返回0,结束消息循环,程序结束。DispatchMessage通过Windows USER模块把消息分派到窗口函数。当点击关闭按钮,系统生成WM_CLOSE消息,通常窗口函数不处理此消息,而通过DefWindowProc处理,DefWindowProc收到WM_CLOSE后调用DestroyWindow函数销毁窗口,同时发出WM_DESTROY消息。程序对WM_DESTROY的标准反应是调用PostQuitMessage,PostQuitMessage送出WM_QUIT消息进而结束程序。如果不按照此步骤处理消息,则可能出现窗口已经销毁但进程无法结束的情况。

    当调用GetMessage时,如果没有获取到消息,操作系统会挂起线程,如果调用PeekMessage,如果没有获取到消息,线程也可以得到一段运行时间,并且PeekMessage可以获取WM_QUIT消息。

    不涉及任何UI和窗口对话框的Win32程序,称为Dos-like程序,即Console程序。在DOS环境下开发的程序称为DOS程序,当然不能调用Win32 API。

    C Runtime函数库分为单线程与多线程之分。

    线程是CPU的调度单位。

    核心对象是系统的一种资源,核心对象一旦产生,任何其他程序都可以使用,每个核心对象都通过自己的计数值进行管理,核心对象通过handle进行标识,每被使用,其计数值增加1。当某个实体停止使用核心对象时,只需调用CloseHandle即可。

    在shell(资源管理器或文件管理器)中双击某个可执行文件后,shell调用CreateProcess激活App.exe,系统产生进程对象,并为该进程建立地址空间,加载器把必要的代码和数据加载到地址空间。系统为此进程建立线程,称为主线程。系统通过C Runtime中的Startup Code使线程开始进入WinMain函数,开始消息循环。使用者关闭主窗口后,消息循环结束,WinMain结束,系统调用ExitProcess结束进程。理论上所有进程都时shell的子进程,但在通过CreateProcess创建进程时通过调用CloseHandle(ProcInfo.hThread)和CloseHandle(ProcInfo.hProcess)可以结束这种进程的父子关系。

    执行程序代码是线程的工作,当进程建立起来后,主线程也同时产生。调用CreateThread可以产生一个新线程,系统会帮我们返回线程的handle对象,配置线程的Context,保留线程堆栈,配置堆栈指针缓存器,指令指针缓存器。所谓工作切换,就是对线程的Context的切换。创建线程时通过线程函数指定线程执行的主体代码。

    线程的优先级通过2个步骤设定,创建进程时设定进程的优先级,创建线程时微调线程的优先级。

  • 相关阅读:
    uva------(11464)Even Parity
    java SE学习之线程同步(详细介绍)
    MFC学习之窗口基础
    java多线程的常用方法(以及注意事项)
    java多线程下如何调用一个共同的内存单元(调用同一个对象)
    java之多线程(Thread)
    HDUOJ------3336 Count the string(kmp)
    hduoj------2594 Simpsons’ Hidden Talents
    POJ--2158--------------Milking Grid(最小覆盖字符矩阵)---(开二维kmp)
    poj-------------(2752)Seek the Name, Seek the Fame(kmp)
  • 原文地址:https://www.cnblogs.com/jefflee/p/6357792.html
Copyright © 2011-2022 走看看