
Windows核心编程
ACE1985
这个作者很懒,什么都没留下…
展开
-
《Windows核心编程》のWindows返回值
当调用一个Windows函数时,它首先检验传递给它的各个参数的有效性,然后再设法执行任务。如果传递了一个无效参数,或者由于某种原因无法执行这项操作,那么操作系统就会返回一个值,指明该函数在某种程度上运行失败了。 下面说说Windows常见的返回值类型:1) VOID:表明该函数运行不可能失败,Windows函数的返回值很少是VOID。2) BOOL:如果函数运行失败,返回值是0,原创 2010-04-18 22:52:00 · 1944 阅读 · 0 评论 -
《Windows核心编程》の“查找”和“替换”对话框+“页面设置”对话框
<br />要显示“查找”和“替换”文本对话框分别使用函数FindText和ReplaceText:<br />HWND WINAPI FindText(<br /> __in LPFINDREPLACE lpfr<br />);<br />HWND WINAPI ReplaceText(<br /> __inout LPFINDREPLACE lpfr<br />);<br />这两个函数都使用同样的FINDREPLACE结构:<br />typedefstruct {<br /> DWORD原创 2010-07-28 10:15:00 · 3018 阅读 · 0 评论 -
《Windows核心编程》の“打开”和“保存”文件对话框
<br />Windows操作系统为一些常用功能提供了一些通用对话框(Common Dialog Box),比如,在不同应用程序中运行打开文件、选择字体、选择颜色等操作时,不同程序显示的对话框的模样都是一样。这些对话框是操作系统提供的,实现对话框的代码封装在Comdlg32.dll库文件中,由于不同版本的Comdlg32.dll在设计上可能有所不同,所以不同版本的Windows下对话框会有所不同。<br />Windows提供多种通用对话框,每种通用对话框都使用一个专用的函数来创建和显示,另外,提供一个数据原创 2010-07-28 09:34:00 · 4284 阅读 · 0 评论 -
《Windows核心编程》の线程局部存储TLS
<br />线程局部存储(Thread Local Storage,TLS)用来将数据与一个正在执行的指定线程关联起来。我们在应用程序和DLL中可以使用两种类型的TLS:动态TLS和静态TLS。但一般来说,这两项技术在创建DLL的时候更加有用,这是因为DLL通常并不知道它们被链接到的应用程序的结构是什么样的。但是在编写应用程序时,我们一般都知道自己要创建多少线程,自己会如何使用这些线程。然后我们就可以设计一些替代方案来为每个线程关联数据,或者设计得好一点的话,可以使用基于栈的方法(局部变量)来为每个线程关联原创 2010-07-29 21:47:00 · 3088 阅读 · 0 评论 -
《Windows核心编程》の定时器
在DOS操作系统中要用到定时器功能的时候一般有两种方法:一是用一个空循环来延时;一是截获时钟中断,计算机的硬件时钟中断会以每55ms一次的频率触发8号中断,而在默认的int 08h中断处理程序中有一句int 1ch的代码,所以截获int 08h和int 1ch都可以达到定时的要求。而在Windows操作系统中,用户程序不可能去截获时钟中断,而是使用定时器功能。在应用程序中需要使用定时器时,可以用SetTimer函数向Windows申请一个定时器,要求系统在指定时间以后“通知”应用程序,如果申请成功,系统会以原创 2010-08-01 14:47:00 · 2102 阅读 · 0 评论 -
《Windows核心编程》のWindows时间
<br />Windows时间的获取和设置:<br />在Win32编程中,常用的获取系统时间的函数是有两个,即GetLocalTime和GetSystemTime:<br />void WINAPI GetLocalTime(<br /> __out LPSYSTEMTIME lpSystemTime<br />);<br />void WINAPI GetSystemTime(<br /> __out LPSYSTEMTIME lpSystemTime<br />);<br />这两个函数的区别原创 2010-08-01 16:08:00 · 2144 阅读 · 0 评论 -
《Windows核心编程》の线程间同步
<br />Windows中线程间同步的方法主要有:事件(Event)、临界区(Critical Section)、互斥量(Mutex)和信号灯(Semaphore)。<br /> <br />1)使用事件对象进行线程间同步:<br />在使用CreateEvent函数创建事件对象时,将bManualReset参数设置为FALSE,然后在需要独占操作的代码前面加上一个WaitForSingleObject函数,后面加上一个SetEvent即可。<br />由于bManualReset参数为FALSE,这样当原创 2010-08-02 09:57:00 · 1849 阅读 · 0 评论 -
《Windows核心编程》の内存操作和内存信息管理
<br />=======================内存操作函数========================<br />1)复制内存使用函数CopyMemory:(注意:源内存区域与目的地址区域不能重叠)<br />void CopyMemory(<br /> __in PVOID Destination, //目的地址<br /> __in const VOID *Source, //源地址<br /> __in SIZE_T Length //要复制的数据的字节大小,注意Desti原创 2010-08-02 21:17:00 · 1930 阅读 · 0 评论 -
《Windows核心编程》の窗口闪烁函数FlashWindow和FlashWindowEx
<br />为了通知用户某种错误发生了,很多应用程序一般使用MessageBeep函数发出蜂鸣声,或者调用函数FlashWindow或FlashWindowEx来使特定的窗口闪烁。应用程序也能使用这些函数来引起用户对某个事件关注,然后显示一个消息提示对话框或一条详细错误信息。<br /> <br />1)FlashWindow函数用来使某个指定的窗口产生一次闪烁的效果,它同样不会改变窗口的活动状态(如果要使窗口闪烁指定的次数,则需要使用下面介绍的FlashWindowEx函数):<br />BOOL WIN原创 2010-08-15 17:49:00 · 5809 阅读 · 0 评论 -
《Windows核心编程》の窗口过程的使用
<br />1)设计一个窗口过程:<br />下面的实例代码展现了经典的窗口过程的结构。窗口过程使用switch语句处理传入的消息参数uMsg,<br />LRESULT CALLBACK MainWndProc(<br /> HWND hwnd, // handle to window<br /> UINT uMsg, // message identifier<br /> WPARAM wParam, // first message paramete原创 2010-08-28 19:43:00 · 2447 阅读 · 1 评论 -
《Windows核心编程》の“字体”和“颜色”对话框
<br />“字体”通用对话框列出了系统中安装的字体,用户可以在上面选择字体名称,同时可以选择字体大小、颜色,以及一些效果如斜线、粗体、删除线或下划线等,显示选择“字体”对话框的函数是ChooseFont:<br />BOOL WINAPI ChooseFont(<br /> __inout LPCHOOSEFONT lpcf<br />);<br />lpcf指向CHOOSEFONT结构:<br />typedefstruct {<br /> DWORD lStructSize; //原创 2010-07-28 09:50:00 · 4118 阅读 · 0 评论 -
《Windows核心编程》---又是内存
<br />一般情况下,应用程序使用的内存空间里有以下“默认”的区域:<br />1)栈:用于维护函数调用的上下文,离开了栈函数调用就没法实现。栈通常在用户空间的最高地址处分配,通常有数兆字节的大小;<br />2)堆:用来容纳应用程序动态分配的内存区域,当程序使用malloc或new分配内存时,得到的内存来自堆里。堆通常存在于栈的下方(低地址方向),在某些时候,堆也可能没有固定统一的存储区域,堆一般比栈大很多,可以有几十到数百兆字节的容量;<br />3)可执行文件映像:存储着可执行文件在内存中的映像。由原创 2010-07-29 11:21:00 · 1845 阅读 · 0 评论 -
《Windows核心编程》---执行可执行文件
<br />方法一:Shell调用:<br />Win32中可以通过WinExec和ShellExecute函数来执行另一个可执行程序。<br />WinExec函数原型如下:<br />UINT WINAPI WinExec(<br /> __in LPCSTR lpCmdLine, //包含可执行文件名和命令行参数<br /> __in UINT uCmdShow //指定窗口的显示方式,如果有窗口的话<br />);<br />如果文件被成功执行,那么函数返回一个大于31的值。使用WinExe原创 2010-07-26 20:59:00 · 2166 阅读 · 0 评论 -
《Windows核心编程》の聊聊MIB相关结构
MIB_IPADDRTABLE结构是一张Ipv4地址入口表,其定义如下:typedef struct _MIB_IPADDRTABLE { DWORD dwNumEntries; //表中Ipv4地址入口的个数 MIB_IPADDRROW table[ANY_SIZE]; //一个指向实现为MIB_IPADDRROW结构数组原创 2010-04-23 13:31:00 · 2803 阅读 · 0 评论 -
《Windows核心编程》---终止处理程序
<br />结构化异常处理(SEH)包含两方面的功能:终止处理和异常处理。<br />终止处理程序确保不管一个代码块是如何退出的,另一个代码块总能被调用和执行。终止处理的语法如下:<br />__try<br />{ <br /> // guarded body of code (被保护代码)<br /> <br />} <br />__finally<br />{ <br /> // __finally block (终止处理代码)<br /> <br />}<br />操作系统和编译器的协同原创 2010-07-04 14:59:00 · 1398 阅读 · 0 评论 -
《Windows核心编程》---Windows Shell目录管理
<br />Windows shell最重要的组成部件是explorer.exe,在使用Windows操作系统时,开始菜单、任务栏、资源管理器等都是explorer.exe提供的。<br />Windows shell编程接口的函数名一般是以SH开头的。一般Shell API都在shlobj.h头文件中声明,由Shell32.dll导出,链接时需要使用到Shell32.lib库。<br />Shell最重要的功能之一是进行文件浏览、查找、管理以及将文件和应用程序关联。Windows Shell中有很多特殊目原创 2010-07-04 21:42:00 · 3079 阅读 · 1 评论 -
《Windows核心编程》---Interlocked原子访问系列函数
所谓原子访问,指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。Interlocked系列函数提供了这样的操作。所有这些函数会以原子方式来操控一个值。Interlocked函数的工作原理取决于代码运行的CPU平台,如果是x86系列CPU,那么Interlocked函数会在总线上维持一个硬件信号,这个信号会阻止其他CPU访问同一个内存地址。我们必须确保传给这些函数的变量地址是经过对齐的,否则这些函数可能会失败。C运行库提供了一个_aligned_malloc函数,我们可以使用这个原创 2010-07-12 21:15:00 · 7581 阅读 · 0 评论 -
《Windows核心编程》---C运行库的内存对齐函数
<br />C运行库提供了一系列函数用于分配对齐过的内存:<br />1)_aligned_malloc函数的功能是分配一块对齐过的内存:<br />void * _aligned_malloc(<br /> size_t size, //要分配的字节数<br /> size_t alignment //要对齐到的字节边界,传给alignment的值必须是2的整数幂次方<br />);<br /> <br />2)_aligned_offset_malloc函数用于在指定的内存对齐边界上分配内原创 2010-07-12 21:44:00 · 3000 阅读 · 0 评论 -
《Windows核心编程》---可等待定时器
<br />可等待定时器是这样一种内核对象,它们会在某个指定的时间触发,或每隔一段时间触发一次。它们通常用来在某个时间执行一些操作。<br />CreateWaitableTimer函数用于创建一个可等待定时器:<br />HANDLE WINAPI CreateWaitableTimer(<br /> __in_opt LPSECURITY_ATTRIBUTES lpTimerAttributes, //安全描述符,为NULL时使用默认的<br />//且该句柄不被子进程继承<br /> __in原创 2010-07-19 15:16:00 · 3975 阅读 · 0 评论 -
《Windows核心编程》---堆管理函数
<br />Windows的“堆”分为默认堆和私有堆两种。默认堆是在程序初始化时由操作系统自动创建的,所有标准内存管理函数都是在默认堆中申请内存的;而私有堆相当于在默认堆中保留了一大块内存,用堆管理函数可以在这个保留的内存区域中分配内存。一个进程的默认堆只有一个,而私有堆可以被创建多个。<br /> <br />默认堆可以直接被使用,而私有堆在使用前需要先创建,使用私有堆有很多好处:<br />1)可以使用默认堆的函数有多种,而它们可能在不同的线程中同时对默认堆进行操作,为了保持同步,对默认堆的访问是顺序进原创 2010-07-25 19:56:00 · 2890 阅读 · 0 评论 -
《Windows核心编程》---获得内存的当前状态のGlobalMemoryStatusEx
Win32系统中,一个进程可寻址的地址空间是4GB,用户可使用的地址空间是大概是2GB,但这不是说用户可以申请2GB的内存,因为这2GB只是可以使用的“地址”空间,而不是可以使用的“内存”空间,可分配内存的大小还受制于物理内存和磁盘交换文件的大小。因为物理内存和磁盘交换文件是供整个系统和所有用户程序使用的,所有系统内核、当前执行的所用用户程序的代码、数据,以及分配的内存总量并不能超过物理内存和磁盘交换文件的总和。当设计一个可能需要申请大量内存的程序时,我们就需要预先得知系统的配置情况,这时可以使用Globa原创 2010-07-24 22:55:00 · 3225 阅读 · 0 评论 -
《Windows核心编程》---逻辑驱动器操作
Windows中的文件组织方式采用分层次的结构:计算机中可以安装有多个物理驱动器,每个物理驱动器可以分为多个主分区和扩展分区,每个主分区就是一个逻辑驱动器,而每个扩展分区可以划分为多个逻辑驱动器,逻辑驱动器组成我们熟悉的C盘与D盘等盘符。对于每个逻辑驱动器,可以给它取一个标号叫做“卷标”,卷标是当作一个目录项存放在逻辑驱动器的根目录中的。逻辑驱动器操作:SetVolumeLabel函数用来为一个驱动器创建、修改以及删除卷标:BOOL WINAPI SetVolumeLabel( __in_opt LPC原创 2010-07-26 10:56:00 · 2136 阅读 · 0 评论 -
《Windows核心编程》の托盘程序的编写(CSystemTray类)
<br />研究下托盘程序,或者说:任务栏通知区域(Tray)图标。<br />很多应用程序在系统Shell任务栏通知区域有图标提示。通知区域图标适用于长时间运行但无需用户过多操作,并在有事件发生时可随时根据情况通知用户的应用程序(如即时通信工具、下载工具等)。<br />使用任务通知区域图标的好处如下:<br />1) 窗口程序可以在后台运行,窗口退出,但是程序仍然在运行,减少窗口数量,便于用户操作;<br />2)窗口最小化后,不占用任务栏的位置,使用户在操作主机时将精力集中在需关注的窗口;<br /原创 2010-09-04 21:42:00 · 5058 阅读 · 0 评论