系统空闲时间处理 OnIdle
所谓的空闲时间是指"系统中没有任何消息等待处理"的时间,
对话框的运行
两类 modal的(模态对话框), modeless的(非模态)对话框
常用的模态对话框需要准备两样东西
1.对话框模板(dialog template)
简单的说就是在VC资源编辑器里面画的那个东西
2.对话框过程(dialog procedure)
类似于窗口函数,但是只处理WM_INITDIALOG和WM_COMMAND两则消息,对话框中各个控件也是窗口,他们以消息与其父窗口,即对话框沟通,所有控件传来的消息也都是WM_COMMAND, 由其参数来分辨是那一种控件及那一种通知消息(notification);
模块定义文件
定义了模块名称, 程序段, 数据段的内存特性, 模块堆(heap)的大小, 模块栈(stack)的大小, 所有的callback函数名称的登记等
Console执行文件
Console并不是一定工作于V86模式的, Console程序仍然是所谓的PE格式 即(Portable Excutable)而非DOS下的工作的MZ格式.
线程与进程(Thread and Process)
在Windows中, 线程是cpu的调度单位, 而进程则是一种组织管理程序形成的数据结构
核心对象,核心对象是系统的一种资源,系统对象一旦产生, 任何应用程序都可以开启并使用改对象, 系统给与核心对象一个计数值(usage count)作为管理计数只用.
核心对象每被产生一次都会获得一个handle作为标志,每被使用一次,其计数值加1,核心对象的结束只需要调用CloseHandle即可.
进程的诞生和死亡
首先shell调用CreateProcess 激活App.exe
然后系统产生一个核心对象
系统为核心对象分配一个4GB的内存空间
加载必要的代码,包括程序代码,包括程序的代码, 在程序执行文件的.idata节中提到调用的dll
系统为此进程建立一个主线程,线程是CPU的时间分配对象
系统调用C runtime函数库的startup code
startup code调用winmain函数
app开始运行
当关闭主窗口时
winmain消息循环结束, winmain结束
返回startup code
回到系统, 系统调用ExitProcess结束进程( 尚未能验证, 感觉不对);
产生子进程使用CreateProcess函数
其形式如下
当系统产生进程对象和线程对象的时候会把两个对象的handle填入此结构体的相关字段中.
所谓的空闲时间是指"系统中没有任何消息等待处理"的时间,
//只需要改消息循环为这个样子 while(true) { if (PeekMessage( &msg, NULL, NULL, PM_REMOVE)) { if (msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } else { OnIdle(); } } //在消息队列中没有消息时的下次循环中,GetMessage会过门而不入,而 //PeekMessage则会取回自己的控制时间
对话框的运行
两类 modal的(模态对话框), modeless的(非模态)对话框
常用的模态对话框需要准备两样东西
1.对话框模板(dialog template)
简单的说就是在VC资源编辑器里面画的那个东西
2.对话框过程(dialog procedure)
类似于窗口函数,但是只处理WM_INITDIALOG和WM_COMMAND两则消息,对话框中各个控件也是窗口,他们以消息与其父窗口,即对话框沟通,所有控件传来的消息也都是WM_COMMAND, 由其参数来分辨是那一种控件及那一种通知消息(notification);
模块定义文件
定义了模块名称, 程序段, 数据段的内存特性, 模块堆(heap)的大小, 模块栈(stack)的大小, 所有的callback函数名称的登记等
Console执行文件
Console并不是一定工作于V86模式的, Console程序仍然是所谓的PE格式 即(Portable Excutable)而非DOS下的工作的MZ格式.
线程与进程(Thread and Process)
在Windows中, 线程是cpu的调度单位, 而进程则是一种组织管理程序形成的数据结构
核心对象,核心对象是系统的一种资源,系统对象一旦产生, 任何应用程序都可以开启并使用改对象, 系统给与核心对象一个计数值(usage count)作为管理计数只用.
核心对象每被产生一次都会获得一个handle作为标志,每被使用一次,其计数值加1,核心对象的结束只需要调用CloseHandle即可.
进程的诞生和死亡
首先shell调用CreateProcess 激活App.exe
然后系统产生一个核心对象
系统为核心对象分配一个4GB的内存空间
加载必要的代码,包括程序代码,包括程序的代码, 在程序执行文件的.idata节中提到调用的dll
系统为此进程建立一个主线程,线程是CPU的时间分配对象
系统调用C runtime函数库的startup code
startup code调用winmain函数
app开始运行
当关闭主窗口时
winmain消息循环结束, winmain结束
返回startup code
回到系统, 系统调用ExitProcess结束进程( 尚未能验证, 感觉不对);
产生子进程使用CreateProcess函数
其形式如下
BOOL WINAPI CreateProcess( __in_opt LPCTSTR lpApplicationName, //可执行文件名字 __inout_opt LPTSTR lpCommandLine, //新进程的命令行 __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes, __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in BOOL bInheritHandles,// 安全属性及是否被继承 __in DWORD dwCreationFlags,//许多常数的组合,影响进程的创建 __in_opt LPVOID lpEnvironment,//环境变量,为NULL则继承父进程的 __in_opt LPCTSTR lpCurrentDirectory,//当前子进程的工作目录与驱动器 __in LPSTARTUPINFO lpStartupInfo,//一个指向StartupInfo的指针 __out LPPROCESS_INFORMATION lpProcessInformation //另一个指针 );其中 最后一个指针所对应的PPRCESS_INFORMATION结构如下所示
typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_INFORMATION;
当系统产生进程对象和线程对象的时候会把两个对象的handle填入此结构体的相关字段中.