win32 program
文章平均质量分 75
humin_jx
这个作者很懒,什么都没留下…
展开
-
C1、对程序错误的处理
函数:DWORD GetLastError(); //返回32bit错误代码//转换成文本描述:DWORD FormatMessage(……);头:WinError.h调试: 1、Watch窗口:输入“@err,hr”; 2、Error Lookup定义自己的错误代码:VOID SetLastError(DWORD dwErrCode);转载 2009-12-07 23:46:00 · 431 阅读 · 0 评论 -
C18、堆栈
我们以前最常用的方法。用于分配较小的数据块:链表和树。无分配粒度和页面边界的问题。缺点:速度慢,无法直接控制物理存储器的提交和回收。一、进程的默认堆栈:n 进程初始化时,系统在进程的地址空间创建。默认大小1MB。可以用/HEAP链接开关改变默认大小(DLL没有与其相关的堆栈!): /HEAP: reserve[,commit]n 老的16位函数L转载 2009-12-23 18:48:00 · 724 阅读 · 0 评论 -
C17、内存映射文件
一、使用目的:n 系统加载执行.exe 和DLL文件(节省页文件空间,快速启动);n 访问磁盘文件而不必进行I/O操作和缓存;n 进程间共享数据(进程间通讯最有效的方法)。 二、默认情况下,全局数据和静态数据不能被同一个.exe 或DLL文件的多个映像共享。但可以改变(但不鼓励使用)。改变的方法:n 每个.转载 2009-12-23 18:46:00 · 1469 阅读 · 0 评论 -
C23、结束处理程序
__try; __finally; __leaveu 正常从try块结束后进入finally;__leave会跳出try块,执行finally(无系统开销);u 局部展开:如果try块过早退出(goto, longjump, continue, break, return等),强制转移到finally块执行(系统开销大!); u 全局展开(globa转载 2010-01-05 20:18:00 · 499 阅读 · 0 评论 -
C27、硬件输入模型和局部输入状态:
一、 原始输入线程(系统初始化时建立):鼠标和键盘 à 设备驱动程序 à 系统硬件输入队列(System Hardware Input Queue,SHIQ)à 原始输入线程(Raw Input Thread, RIT)à VIQ à 线程的THREADINFO。 RIT如何分发:鼠标:RIT确定哪个窗口(有焦点),调用GetWindowThreadProcessId确定线程;转载 2010-01-06 16:03:00 · 731 阅读 · 0 评论 -
C19、DLL
Windows三个重要的DLL:n Kernel32.dll:管理内存、进程、线程n User32.dll:执行用户界面(窗口创建和消息传送)n GDI32.dll:画图和文本显示。特殊DLL:n AdvAPI32.dll:安全、注册表、事件记录n ComDlg32.dll:常用对话框n翻译 2010-01-05 19:50:00 · 605 阅读 · 0 评论 -
C26、窗口消息
u 一个进程至多建立拥有1万个不同类型的用户对象(User Object):图符、光标、窗口类、菜单、加速键表等。u 窗口和挂钩(hook)由线程拥有。u 线程(进程)结束,用户对象被OS删除。u 建立窗口的线程必需为这个窗口处理所有的消息。主消息循环使用GetMessage 或PeekMessage取出一个消息,检查hwnd是否为NUL转载 2010-01-05 20:38:00 · 771 阅读 · 0 评论 -
C20、高级DLL
一、显式加载DLL模块:a) HINSTANCE LoadLibrary(PCTSTR pszDllPathName);b) HINSTANCE LoadLibraryEx(PCTSTR pszDllPathName, //路径(包含文件全名)。HANDLE hFile; // NULLDWORD dwFlags); /转载 2010-01-05 20:00:00 · 1295 阅读 · 0 评论 -
C22、插入DLL和挂接API
将DLL插入到另一个进程的地址空间,对他做任何事。一、插入DLL:SetWindowLongPtr(hwnd, GWLP_WNDPROC, MySubclassProc);二、使用注册表来插入DLL:A. 注册表位置:HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Windows/AppI转载 2010-01-05 20:20:00 · 752 阅读 · 0 评论 -
C25、未处理异常和C++异常
一、异常过滤器返回EXCEPTION_CONTINUE_SEARCH:用于告诉系统我们在这个except块中未处理这个异常,到前面一个except块相匹配的try块,并调用这个try块的异常处理。如果每个过滤器都这样返回,则是未处理异常,unhandled exception,将导致线程和进程终止。系统给出一个出错消息框,终止或调试程序。(如果在内核方式运行,出现蓝屏死机, balt)。二、防转载 2010-01-05 20:33:00 · 806 阅读 · 0 评论 -
C21、线程本地存储(TLS)
一、动态TLS:a) DWORD TlsAlloc();u 该函数使系统对进程中的位标志进行扫描,找出一个FREE标志,并转换为INUSE,返回标志的索引。如果找不到FREE标志,返回TLS_OUT_OF_INDEXES(0XFFFFFFFF)。u 而且,如果这个索引位置已经分配了内存,会删除内存,并置0。b) 将值放入本线转载 2010-01-05 20:06:00 · 595 阅读 · 0 评论 -
C13、Windows的内存结构
一、进程的虚拟地址空间n 每个进程都被赋予虚拟地址空间。32位进程是4GB(0x00000000~0xFFFFFFFF),64位为16EB(0x0000000000000000~0xFFFFFFFFFFFFFFFF)。n 运行的线程只能访问它自己的进程的内存,属于其他进程的内存则隐藏,不能被访问。在Win2000,OS的内存也隐藏不能被访问,而Win转载 2009-12-23 18:24:00 · 625 阅读 · 0 评论 -
C16、线程的堆栈
按照默认,系统为线程保留一个堆栈空间区域(1MB),并将物理存储器(2页面)提交给这个已保留的区域。可以在链接程序时修改默认设定:/STACK: /reserve[, commit]。CRT函数会对堆栈做检查。我们在程序中可以使用结构化异常处理技术(try-except)对堆栈溢出作出补救。转载 2009-12-23 18:43:00 · 421 阅读 · 0 评论 -
C15、使用虚拟内存
Windows提供3种进行内存管理的方法:n 虚拟内存:管理大型对象或结构数组。n 内存映射文件:管理大型数据流(通常来自文件)及多进程共享数据。n 内存堆栈:管理大量的小对象。管理虚拟内存的函数可以用来直接保留一个地址空间区域,提交物理存储器,设置保护属性。一、地址空间中保留及提交一个区域:PVOID Virt转载 2009-12-23 18:40:00 · 575 阅读 · 0 评论 -
C3、内核对象
一、引用计数二、安全性:客户端一般传递NULL,为默认的安全属性。n 如果在WIN98上开发、运行良好,而在WIN2000出错,可以把安全属性改为:KEY_QUERY_VALUEn 如何区分内核对象还是GDI或用户对象?区别在于创建函数是否有安全属性。三、跨进程边界共享内核对象(方法)a) (对象句柄的)继承性:n转载 2009-12-07 23:48:00 · 425 阅读 · 0 评论 -
C4、进程
一、进程基址(进程的实例句柄):a) HMODULE = HINSTANCEb) 默认基址:0x00400000,一般应>=。c) 可以改变加载基址,link中/BASE:addressd) 获取基址:HMODULE GetModuleHandle(PCTSTR pszModule); 如果in “NULL”,返回调用的转载 2009-12-07 23:50:00 · 434 阅读 · 0 评论 -
C5、作业
作业(组合一组进程的实体,沙盒?)(win98不支持)n 将进程放入作业,参见:void StartRestrictedProcess();n 获取当前作业中的一组进程ID,参见:void EnumProcessIdsInJob(HANDLE hjob);n 作业的通知信息:一、分配的CPU时间是否已到期:一旦分配的CPU时间用完,O转载 2009-12-07 23:52:00 · 861 阅读 · 0 评论 -
C6、线程
一、介绍:(与进程一样,由两部分组成:线程内核对象,地址空间(堆栈)),但线程的开销比线程小很多;能简化用户界面;充分利用CPU。 二、线程函数:a) 线程进入点函数:DWORD WINAPI ThreadFunc(PVOID, pvParam){ DWORD dwResult = 0 ; … return (dwResult);}转载 2009-12-07 23:54:00 · 513 阅读 · 0 评论 -
C7、线程的调度、优先级、亲缘性
一、暂停线程的运行:a) 创建时使用CREATE_SUSPENDEDb) DWORD SuspendThread(HANDLE hThread);二、恢复执行(唤醒):DWORD ResumeThread(HANDLE hThread);三、线程睡眠:VOID Sleep(DWORD dwMilliseconds);四、转换到其他线程:BOOL S转载 2009-12-07 23:55:00 · 670 阅读 · 0 评论 -
C8、 用户方式的线程同步
(用户方式同步的优点:同步速度快;但是,锁函数缺点:单值,不能使线程进入等待状态;关键代码段:单进程中的线程实施同步,易死锁) 一、互锁函数(原子方式运行,速度快!):a) LONG InterLockedExchangeAdd(PLONG plAdded, LONG lIncrement);//相当于*plAdded += lIncrement;b)转载 2009-12-07 23:57:00 · 516 阅读 · 0 评论 -
C9、线程与内核对象的同步
(内核对象机制,优点:适应性好,跨进程访问;缺点:速度慢)一、等待函数(使线程进入等待状态):a) DWORD WaitForSingleObject(HANDLE, DWORD dwMilliseconds); //INFINITE返回值指明变为可调度状态的原因,所等待的对象变为已通知:WAIT_OBJECT_0;超时:WAIT_TIMEOUT;传入了无效句柄:WAI转载 2009-12-07 23:58:00 · 524 阅读 · 0 评论 -
C11、线程池的使用
线程池由四个独立的部分组成:定时器,等待,I/O,非I/O。当进程初始化时,无开销。但是,一旦有线程池函数调用,就为进程创建某些组件。 多线程应用程序的困难,是面对两大问题:管理线程的创建和撤销,资源访问同步。线程池函数的功能:一、异步调用函数:a) 该方案是C/S应用程序的典型实现,经常处理异步I/O请求(高性能可伸缩应用程序的秘诀!)转载 2009-12-08 20:18:00 · 1769 阅读 · 0 评论 -
C12、纤程
目的:方便将UNIX服务器程序移植到Windows中(以转换UNIX多线程为Windows多线程,因为他们使用不同的算法结构),Windows程序应该避免使用纤程。纤程以用户(非内核)方式代码实现。 一、将现有的线程转换为纤程:PVOID ConvertThreadToFiber(PVOID pvParam); 该函数为纤程的执行环境分配内存(200 byte),(并初始化)其转载 2009-12-23 18:19:00 · 443 阅读 · 0 评论 -
C14、虚拟内存
一、系统信息a) 函数(检索主机相关信息):VOID GetSystemInfo(LPSYSTEM_INFO psinf);b) SYSTEM_INFO结构 成员说明:n dwPageSize; // CPU页面大小,x86 = 4KB;Alpha、IA_64 = 8KBn lpMinimumApplication转载 2009-12-23 18:38:00 · 643 阅读 · 0 评论 -
C24、异常处理程序和软件异常
__try, __except(exception filter) 一、异常过滤器(exception filter)和异常处理程序一、异常过滤器中使用逗号(,)操作符。从左到右执行,返回最右边表达式的结果。二、异常处理程序,在try块中可以使用return, goto, continue, break等,不会产生速度和代码规模方面的不良影响(与结束处理程序不同)。三、过滤器(转载 2010-01-05 20:24:00 · 690 阅读 · 0 评论