随笔-80  评论-22  文章-0  trackbacks-0

以下主要介绍:win32 程序开发流程,导入函数库,windows的运行机制,输入分类,信息,窗口函数等概念。

MFC microsoft foundation classes
API application programming interface
DLL dynamic link library
GUI graphics user interface
MDI multiple document interface
SDI sigle document interface
OLE object linking&embeded
SDM software development kit
UI user interface
WinApp windows application


windows程序是信息为基础,事件驱动 message based,event driven

windows程序分为程序编码和UI资源两部分,用rc编译器集成一个完整的exe文件

win32 程序开发流程:
资源描述文件.rc中描述各种UI资源,RC编译器RC.EXE读取RC文件描述的所有UI资源

文件集中制作一个.RES文件,再和程序编码结合在一起,成为一个完整的windows可

执行文件。


WINDOWS程序为什么必须使用导入函数库?
windows程序调用的函数分为:c runtimes 以及 windows api两大部分。
windows api,由操作系统本身提供(windows 三大模块

GUI32.DLL,USER32.DLL,KERNEL32.DLL).
导入函数库,就是存放在链接的时候需要使用什么样的dll文件,以及这些文件存放

的地方。而三大模块所对应的导入函数库别为

GUI32.LIB,USER32.LIB,KERNEL32.LIB.

一般函数是存放到了上边的三大模块中,还有新的api函数,放在dll文件中,比如

COMMDLG.DLL,TOOLHELP.DLL,中,如果使用这些API,链接时还得加上这些dll对应的

导入函数,比如COMDLG32.LIB和TH32.LIB.

WINDOWS程序需要什么头文件?
windows程序必须包含windows.h.它包含的是三大模块所提供的api函数,如果用到

其他system dlls,比如COMMDLG.DLL,MAPI.DLL,TAPI.DLL,就要使用相对应的头文件

COMMDLG.H MAPI.H TAPI.H等等。

windows的运行机制?
信息为基础,以事件驱动。
windows程序运行依靠外部发生的事件来驱动的。程序等待任何可能的输入,然后判

断,最后做出适当处理。
输入是由操作系统捕捉到,以信息形式进入程序之中。
信息,就是windows内设的一种数据结构。

输入分类?
硬件设置所产生的信息:放到系统队列(system queue)
windows系统或是其他windows程序传送过来的信息:放到程序队列(application

queue)。

信息?
信息,就是windows内设的一种数据结构。
typedef struct tagMSG
{
 HWND hwnd;
 UINT message;(WM_)
 WPARAM wParam;(WM_MOUSEMOVE,WM_SIZE,WM_LBUTTONDOWN)
 LPARM lParm;
 DWORD time;
 POINT pt;
}MSG;
接受并处理信息的就是窗口。每个窗口都有一个函数负责处理信息,这个函数就叫

窗口函数(window procedure,window function)

窗口注册和窗口的诞生?
窗口函数就是窗口接收信息后的反应。
产生窗口前用API函数RegisterClass设定窗口属性(就是注册窗口)

窗口的注册用的是RegisterClass (被封装在InitApplication函数中)
窗口的诞生是用CreateWindow(被封装在InitInstance函数中)
InitApplication 和 InitInstance区别:

函数注册:窗口类只需要注册一次,以后可供同一程序的后继每一个实例

(instance)使用(所有进程公在一个地址空间中),因此将RegisterClass这个动

作放在“只有第一个实例才会进入”的InitApplication函数中。
一个进程是否是某个程序的第一个实例,可以用WinMain的参数hPrevInstance来判


产生窗口:CreateWindow是任何实例都可以进入,放到InitInstance函数中。

 


信息循环?
while(GetMessage(&msg,...))
{
 TranslateMessage(&msg);//为了将键盘信息转化
 DispatchMessage(&msg);//将信息传给窗口函数去处理
}

 

窗口函数?

DispatchMessage(&msg)是一种回调函数,就是你自己写的程序中的被windows系统

调用的函数。
窗口函数形式:
LRESULT CALLBACK WndProc(HWND hWnd,
   UINT message,
   WPARAM wParam,
   LPARAM lParam)
资源定义文件(.RC):
.RC文件是一个用文字描述资源的地方。常用资源有九项:ICON(图标),CURSOR(

指针),BITMAP(位图),FONT(字体),DIALOG(对话框),MENU(菜

单),ACCELERATOR(加速器),STRING(字符串),VERSIONINFO.

核心对象?
系统的一种资源,一旦产生,任何应用程序都可以开启并使用这个对象。系统给核

心对象 一个计数值来管理它。
核心对象包括:             产生方法
event   CreateEvent
mutex   CreateMutex
semaphore  CreateSemphore
以上用于线程同步化
file   CreateFile
file-mapping  CreateFileMapping 用于内存映射文件
process   CreateProcess
thread   CreateThread

进程的诞生和死?
shell中以鼠标双击一个可执行文件图标,就可以执行这个(比如)App.exe的流程:
1shell调用CreateProcess启动App.exe。‘
2系统产生一个“进程核心对象”,计数值为1。
3系统为此进程建立一个4GB地址空间
4载入器将必要的数据载入到上述地址空间中,包括App.exe的程序,数据,以及所

需要的连接函数库(DLL).载入器是根据.idata section中的(PE文件格式)的记

录文件。
5系统为此进程建立一个线程,称为主线程。线程才是分配cpu时间的分配对象。
6系统调用 C runtime函数库的Startup code。
7Startup code调用App程序的WinMain函数。
8App程序运行开始
9使用者关闭App主窗口,是WinMain中的信息循环结束掉,于是WinMain结束。
10 返回到Startup code。
11返回到系统,系统调用ExitProcess结束进程。


产生子进程?
用CreateProcess

结束进程?
VOID ExitProcess(UINT fuExitCode);

产生额外的线程?
CreateThread()

当进程建立起来后,系统会完成什么(就是已经有了主线程)?
1配置“线程对象”,其handle将成为CreateThread的返回值
2设定计数值为1
3配置线程的context(工作)
4保留线程的堆栈
5将context中的堆栈指针寄存器(ss)和指令指针寄存器(ip)设定妥当

线程优先级?
0-31 从低到高,

级别       代码    优先权值
idle           IDLE_PRIORITY_CLASS  4
normal  NORMAL_PRIORITY_CLASS    9
high  HIGH_PRIORITY_CLASS  13
realtime REALTIME_PRIORITY_CLASS  24

posted on 2009-07-18 19:27 Bluesea 阅读(1001) 评论(0)  编辑 收藏 引用 所属分类: MFC

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理