
WINDOWS API
文章平均质量分 75
seven-soft
十几年工作经验,软件破解、软件反编译、网络抓包;精通c、c++、java语言,熟悉eclipse、Microsoft Visual Studio、XCODE 开发环境,精通wince和Android开发。精通嵌入式CPU软件开发。
展开
-
GetSaveFileName函数
前面介绍了怎么样打开选择文件读取的对话框,当你设计的软件需要让用户选择保存时,就需要让用户去选择自己合适的文件名称来保存。那么就需要使用到保存文件对话框,也就是API函数GetSaveFileName。下面就来演示怎么样使用这个API函数。 函数GetSaveFileName声明如下: WINCOMMDLGAPI BOOL APIENTRY GetSaveFileNameA(LPO原创 2012-05-04 17:08:23 · 1744 阅读 · 0 评论 -
GetProcessMemoryInfo函数
当大家打开Windows任务管理器时,就会看到每个进程使用内存的分布情况,往往会发现有一些进程占用大量的内存,在这种情况也是一种异常情况,可以作为是否恶意软件的标志之一。下面就来使用API函数GetProcessMemoryInfo来获取内存的使用情况。 函数GetProcessMemoryInfo声明如下: BOOLWINAPIGetProcessMemoryInfo(原创 2012-05-05 10:59:16 · 620 阅读 · 0 评论 -
GetGlyphOutline函数
中西文化的差异,导致在电子信息里处理也大不相同,在英文里只需要26个字母就可以显示所有文章了,而在中文里需要最基本的字符就有2000多个。对于一些在嵌入式软件里要显示的字符,那么就得手动去构造所有图形,这是一个比较大的工作量,如果让每个厂家都去完成这个任务,显然是不可能的。面对着大量嵌入式用户的需求,那么就需要解决中文字模的图形问题。毕竟大家经常使用Windows,最先想到的,肯定是怎么样把里面的原创 2012-05-05 11:09:54 · 1130 阅读 · 0 评论 -
OpenProcess函数
这一年来流氓软件特别多,面对这种非常恶心的软件,让大家非常痛苦。正是在这种环境之下,众多客户需要强大查杀这种流氓软件的工具。如果让你来开发一个查杀这种病毒的软件,你会怎么做呢?当然是先把电脑里所有进程遍历出来,然后把每个进程的详细信息显示给用户,让用户决定自己那些进程可以运行,那些不可以运行。或者根据当前进程的信息,再跟根据病毒库里的特征码进行比较,就可以标识那些是可疑的病毒了。下面就来演示用函数原创 2012-05-05 11:11:47 · 375 阅读 · 0 评论 -
LoadLibrary函数
随着软件规模的扩大,要求的功能也是越来越多,开发人员的参与也是越来越多。因此软件的功能划分,就成为了现代软件工程的重大任务,还有软件开发的并行性也越来越重要。为了解决这些问题,大家都会看到IT硬件发展非常迅速,功能也越来越复杂,但硬件中发展明显提高在于采用IC的方式来实现复杂的功能,也就是把大部份功能集成到一起,只要给出一些引脚就可以实现产品了。而软件中有没有相同于硬件中的IC呢?我想是应有的,就原创 2012-05-05 13:21:51 · 404 阅读 · 0 评论 -
VirtualAlloc函数
上一次学习了全局内存的分配,在Windows里内存管理是分为两部份,全局内存是系统管理的内存,因而所有进程都可以访问的内存,而每一个进程又有自己的内存空间,这就是虚拟内存空间了,而虚拟内存的空间比较大,当物理内存不足时,系统会把虚拟内存的数据保存到硬盘里,这样只要硬盘的空间足够大,每个进程就可以使用3G的内存。虚拟内存分配可以作为程序里分配内存的主要方式,比如大量的数据缓冲区,动态分配内存的空间。原创 2012-05-05 13:26:31 · 378 阅读 · 0 评论 -
SystemParametersInfo函数
面对华丽的Windows桌面,工作的心情或许好很多,但是久了总会失去兴趣,总想定期地更新桌面的图片。软件开发人员又面对这样的需求了,需要怎么样去做呢?努力去找API函数吧。到目前为止,还有很多变桌面图片的软件,并且还能很挣钱的。其实设置桌面图片的需求,在目前数码相片处理软件也有现实的需求,比如当你去旅游回来后,想把照片当作桌面图片,就可以在处理图片时就设置为桌面图片。这样就需要使用函数System原创 2012-05-05 13:28:16 · 359 阅读 · 0 评论 -
GetVersionEx函数
Windows发展还是非常快速的,从Win95,到Win98,再到Win2000和XP系统。每个系统的功能也有所不同,要想在程序里区别不同的系统,就需要获取系统的版本信息。比如XP里有防火墙,而其它以前的系统里没有带有的。但有时编写了一个服务器程序,或者编写BT程序,又需要设置一个端口对外面接收连接,因此在XP系统里就需要设置防火墙的端口,而在XP以前的系统里就没有必要设置端口了。这样的需求,就可原创 2012-05-05 13:30:00 · 435 阅读 · 0 评论 -
GetUserName函数
随着系统安全性的加强,每个系统里越来越多不同的帐号登录。假如你正在开发一个上网安全软件,让不同的用户有不同的上网权限,这样就需要识别当前的用户是什么帐号登录了,然后再作出权限分配。还有出错时,也需要对当前帐号进行记录下来,因为不同的帐号有不同的权限,有些磁盘是不允许操作的。面对这些需求,就需要使用函数GetUserName。 函数GetUserName声明如下: WINADVAPI原创 2012-05-05 13:30:57 · 543 阅读 · 0 评论 -
GetOpenFileName函数
当用户想选择打开以前保存的文件时,就需要使用到选择文件对话框。其实在Windows的API里已经有这样完美的对话,只需要简单的调用,就可以使用了,而不需要写一大堆其它的代码。下面就来演示一下怎么使用文件选择对话框。 函数GetOpenFileName声明如下: WINCOMMDLGAPI BOOL APIENTRY GetOpenFileNameA(LPOPENFILENAMEA)原创 2012-05-04 17:09:19 · 569 阅读 · 0 评论 -
EnumProcesses函数
当你开发的软件在用户那里运行出错了,想怎么办呢?当然是希望把出错时候的运行环境信息生成报表,然后再Email回来查看了。这里就介绍一个函数可以把当时运行环境的进程全部找到,然后可以输出每个进程的信息。当然,这个函数也可以使用到杀病毒软件里,用来查看可疑的进程信息。 函数EnumProcesses声明如下: BOOLWINAPIEnumProcesses ( DWO原创 2012-05-05 11:18:55 · 389 阅读 · 0 评论 -
GlobalMemoryStatusEx函数
在开发软件的过程中,经常会碰到不同用户的PC系统配置不一样。比如有些用户的系统内存配置比较差,这样处理大量数据时,就不能把大量的数据读取到内存里处理了。而又有一些用户的内存比较多,或者是机器比较新,那么就可以加载大量的数据到内存里处理,这样可以随着系统的更新,软件的处理能力能大幅地提高性能。这样就需要了解系统的配置信息了,最重要的资源之一内存,就是最需要了解的,需要调用函数GlobalMemory原创 2012-05-05 13:24:27 · 486 阅读 · 0 评论 -
HeapAlloc函数
前面已经介绍两个分配内存的函数,一个全局的内存分配,一个是私有的内存分配。在进程私有的内存里分配里,又有两种分配情况,一种上基于栈式的内存分配,另一种是基于堆内存的分配。在c++里使用堆内存分配是使用HeapAlloc函数来实现的,也就是实现new操作符分配内存时会调这个函数。 函数HeapAlloc声明如下:WINBASEAPI__bcount(dwBytes)LPVOID原创 2012-05-05 13:25:48 · 406 阅读 · 0 评论 -
GetSystemInfo函数
有一次,我正在开发一个视频压缩程序,而压缩算法是需要非常高效的,也就是需要使用到CPU的多媒体指令。在X86的领域里,目前主要有两家CPU,就是INTEL和AMD。它们的多媒体指令是不一样的。为了区分这种不同的指令,就需要调用函数GetSystemInfo来获取CPU的信息,然后再调用不同的动态连接库来进行多媒体数据压缩。 函数GetSystemInfo声明如下: WINBASEA原创 2012-05-05 13:29:07 · 627 阅读 · 0 评论 -
OpenClipboard函数
多个软件之间进行数据共享是非常重要的,难以想像编辑软件没有CTRL+C,CTRL+V的功能,是多么的不方便。很多的操作,就是拷贝的动作,就是为了数据共享。剪贴板共享是Windows里比较重要的功能,比如很多采集数据的软件为了方便导数据到Excel里面,就可以使用剪贴板的功能。还有即见即所得的界面导到Word里面,也可以使用剪贴板的功能。 函数OpenClipboard声明如下: W原创 2012-05-05 11:25:31 · 564 阅读 · 0 评论 -
FlushInstructionCache函数
一般的程序都是在运行前已经编译好的,因此修改指令的机会比较少,但在软件的防破解里,倒是使用很多。当修改指令之后,怎么样才能让CPU去执行新的指令呢?这样就需要使用函数FlushInstructionCache来把缓存里的数据重写回主内存里去,让CPU重新加载新的指令,才能执行新的指令。下面就来学习一下使用这个函数来实现跳到一个静态函数里执行,而不是直接地调用这个函数。 函数FlushIns原创 2012-05-05 11:26:53 · 874 阅读 · 0 评论 -
GetModuleFileName函数
在开发软件的过程里,经常需要把数据保存到当前执行文件路径下面,或者读取当前执行文件路径下的一些配置信息。这时就需要从当前模块里获取所在的目录路径,以便进行固定的位置操作文件。要解决这个需求,就需要调用API函数GetModuleFileName来获取模块所在的路径。 函数GetModuleFileName声明如下:WINBASEAPIDWORDWINAPIGetModule原创 2012-05-05 13:20:53 · 323 阅读 · 0 评论 -
FormatMessage函数
在开发软件的过程里,经常要做的工作就是调试程序,许多问题的出现,不但是逻辑的问题,还有可能是对API的不熟悉,或者某种条件下调用API会出错的。那么这些出错的原因是什么呢?通常只获取到错误码,也就是通过函数GetLastError得到。当然可以根据这个错误码去查找MSDN就可以知道出错的原因,但有时在客户那里并没有MSDN,那么就需要把调用API函数出错的信息显示出来,或者写到LOG里去。这时就需原创 2012-05-05 13:23:33 · 310 阅读 · 0 评论 -
GetComputerName函数
当你在一个大公司里面,当一个网络管理员时,发现成千上万个电脑需要你去管理时,怎么去区分这些电脑呢?那肯定是通过计算机的名称。而这个网络管理员又需要你开发一套软件,它可以把所有电脑的名称自动地上报给他。面对这样的需求,就可以使用下面的函数GetComputerName来获取计算机的名称,并通过网络传送给管理员。 函数GetComputerName声明如下: WINBASEAPIB原创 2012-05-05 13:32:16 · 366 阅读 · 0 评论 -
SelectObject和DeleteObject函数
Windows显示设备的属性,共有下面几种:位图、画刷、字体、画笔、区域。如果要设置它们到当前设备里,就需要使用SelectObject函数,比如上面介绍的字体设置,就会用到这个函数。当你创建一个位图时,这时Windows就会在内存里分配一块内存空间,用来保存位图的数据。当你创建字体时,也会分配一块内存空间保存字体。如果程序只是分配,而不去删除,就会造成内存使用越来越多,最后导到Windows这幢原创 2012-05-04 17:03:41 · 449 阅读 · 0 评论 -
DirectDraw编程方法与技巧
1 概 述 DirectX是Microsoft为软件开发人员提供的一套精心设计的接口,用于开发高性能、实时的应用程序。它以COM(component object modal)为基本结构[1],位于硬件和软件之间,像gdi(graphics device interface)一样提供了硬件无关的API(application programming interface)接口;它和GDI有一重原创 2012-05-04 17:27:56 · 966 阅读 · 0 评论 -
CreateProcess函数
人们需要处理的信息越来越复杂,往往在一个应用程序里是处理不完的,因此,就出现多个应用程序协同处理同一件事情。当然多个应用程序分开处理,也是比较容易开发,并且让应用程序复杂难度迅速降低。比如在开发一个银行的交易系统,有一个报表生成的主程序,然后还有很多小的,不同的报表生成程序。这样就需要从主程序里创建小报表程序进行运行。创建进程运行,需要使用函数CreateProcess来实现。 函数Cre原创 2012-05-05 11:22:11 · 361 阅读 · 0 评论 -
GetClipboardData函数
前面介绍怎么样把数据放到剪贴板里面,那么又是怎么样从剪贴板里面获取数据出来呢?当然还是需要使用其它的API函数来获取剪贴板里的数据。获取剪贴板里的数据时,是不知道当前剪贴板里是否有数据的,也不知道剪贴板里的数据格式是什么。那么下面就来解决这两个问题,先使用函数IsClipboardFormatAvailable来获取剪贴板里的格式是否可以处理,接着使用函数OpenClipboard打开剪贴板,然后原创 2012-05-05 11:24:08 · 562 阅读 · 0 评论 -
GlobalAlloc函数
在Windows系统里,有一项功能非常实用,就是剪贴板功能,它能够从一个程序里与另一个程序进行数据交换的功能,也就是说两个进程上是可以共享数据。要实现这样的功能,Windows系统在底层上有相应的支持,就是高端地址的内存是系统内存,这样就可以不同的进程进行共享数据了。因此,调用函数GlobalAlloc来分配系统内存,让不同的进程实现共享数据,也就是剪贴板功能,可以在一个进程内分配内存,在另一个进原创 2012-05-05 13:27:15 · 1352 阅读 · 0 评论 -
GetSystemTime和GetLocalTime函数
时间是一个非常重要的信息,比如写LOG时,就需要把时间输出来,跟踪程序是什么时候出错的。或者当你开发一个银行交易系统时,就要记录当前交易的时间,以便后面可以输出报表,打印给信用卡用户。根据不同的需求,可能需要使用不同的时间,目前有UTC和本地时间。UTC是格林威治时间,也就是全球标准时间。本地时间就是相对于UTC而言的,比如中国北京是在东8区,相对于UTC就多了8个小时。一般使用到的时间都是使用本原创 2012-05-06 15:20:11 · 532 阅读 · 0 评论 -
GetTickCount函数
时间计时,也不是越精确越好,有时只需要有一个计时就行了。这样就可以使用毫秒级别的计时函数GetTickCount。这个函数是记录了系统启动以来的时间毫秒,当超过49.7天,这个值变为从0开始,也就是说49.7天是一个周期。当不同的两次函数调时,就返回两次时间差值。 函数GetTickCount声明如下: WINBASEAPIDWORDWINAPIGetTickCount原创 2012-05-06 15:21:36 · 518 阅读 · 0 评论 -
CreateWaitableTimer和SetWaitableTimer函数
用户感觉到软件的好用,就是可以定时地做一些工作,而不需要人参与进去。比如每天定时地升级病毒库,定时地下载电影,定时地更新游戏里的人物。要想实现这些功能,就可以使用定时器的API函数CreateWaitableTimer和SetWaitableTimer来实现了,这对API函数创建的时钟是比较精确的,可以达到100倍的10亿分之一秒。 函数CreateWaitableTimer和SetWai原创 2012-05-06 15:25:49 · 287 阅读 · 0 评论 -
CreateRectRgn和CombineRgn函数
创新是永恒的追求。当大家习惯Windows的界面时,又想自己开发的软件耳目一新的感觉,那么就得要改变窗口的形状,比如心形的窗口,总之是不规则的窗口。这时就需要使用到叫做区域的技术。区域就是把不同的形状的图形进行组合,然后可以填充它,或者在它那里显示。比如MSN左边的TAB按钮,应就是区域的运用就可以实现它了。 函数CreateRectRgn声明如下:WINGDIAPI HRGN原创 2012-05-07 11:04:35 · 354 阅读 · 0 评论 -
SetWindowPos函数
有一天,用户突然对我说,你这个窗口能不能放到最顶端,这样操作和打开文件就很不方便了。这个功能就需要改变窗口的属性了。比如大家使用QQ时,就有一个功能,设置QQ的窗口在最顶端,不管你选择了什么窗口,QQ的界面永远都在最前面。又像FlashGet的状态查看窗口,一直保持在窗口的最前端,让你看到当前下载的流量情况。现在股票那么火爆,很多人一边工作,一边查看股票,如果错失了机会,又少了很多钱的啊!面对这样原创 2012-05-07 11:06:28 · 321 阅读 · 0 评论 -
QueryPerformanceCounter函数
精确的时间计时,有时候是非常必要的。比如播放多媒体时视频与音频的时间同步,还有在测试代码的性能时,也需要使用到非常精确的时间计时。还有测试硬件的性能时,也需要精确的时间计时。这时就需要使用QueryPerformanceCounter来查询定时器的计数值,如果硬件里有定时器,它就会启动这个定时器,并且不断获取定时器的值,这样的定时器精度,就跟硬件时钟的晶振一样精确的。 函数QueryPer原创 2012-05-06 15:22:41 · 646 阅读 · 0 评论 -
RegSetValueEx和RegDeleteValue函数
上一次说到怎么创建注册表的键,但接着下来的问题就是怎么样保存数据到注册表里。注册表使用树形的方式管理数据,所以它的扩展和访问都是比较灵活的。不过注册表是系统重要信息库,每当Windows系统加载时,都首先从硬盘里读取它出来,才知道每台电脑所有硬件配置信息,然后再加载不同的驱动程序。因此,注册表作为系统重要的文件,不要往里面写超过2K的数据大小,这样可以提高系统的速度。下面就来介绍一下怎么样保存一个原创 2012-05-06 15:27:47 · 947 阅读 · 0 评论 -
CreateFileMapping和MapViewOfFile函数
在开发软件过程里,也经常碰到进程间共享数据的需求。比如A进程创建计算数据,B进程进行显示数据的图形。这样的开发方式可以把一个大程序分开成独立的小程序,提高软件的成功率,也可以更加适合团队一起开发,加快软件的开发速度。下面就来使用文件映射的方式进行共享数据。先要使用函数CreateFileMapping来创建一个想共享的文件数据句柄,然后使用MapViewOfFile来获取共享的内存地址,然后使用O原创 2012-05-06 15:33:50 · 363 阅读 · 0 评论 -
FindFirstFile和FindNextFile函数
在开发软件的过程里,经常需要维护目录里的数据。比如在开发银行的信用卡系统里,由于每天创建的LOG非常多,那么一个很大的硬盘,在6个月后,就占用了很多空间。这时就有这样的一个需求,把所有超过6个月的LOG数据定期删除掉。要实现这个功能就得遍历整个目录,把文件名称和文件创建的时间都超过6个月时间的文件删除掉。因此,就需使用到下面的API函数FindFirstFile和FindNextFile来实现这样原创 2012-05-06 15:34:52 · 566 阅读 · 0 评论 -
FlushFileBuffers和SetFilePointer函数
在PC硬件体系结构里,速度最快的存储器是CPU里面的寄存器,接着到二级缓存,再到系统RAM内存,最后才到硬盘。由于这样的体系结构,就决定了操作系统对文件的操作方式,或者说是最优化的算法。比如操作系统接收到写文件的数据时,就会先把数据保存到RAM里,然后在合适的时间或者合适的数据量时再写到硬盘里。但有时候我们希望数据一定要保存到硬盘里,而不是保存在RAM里,这时就需要使用函数FlushFileBuf原创 2012-05-06 15:38:35 · 455 阅读 · 0 评论 -
GetCurrentDirectory和SetCurrentDirectory函数
在开发软件里,常常碰到要读取当前目录下的配置参数文件,或者打开当前目录下别的程序来运行,那么就需要获取当前进程的目录位置,这就需要使用函数GetCurrentDirectory获取当前进程所有在的目录。同时也可以使用SetCurrentDirectory函数来改变进程的当前目录。 函数GetCurrentDirectory和SetCurrentDirectory声明如下: WINB原创 2012-05-06 15:41:37 · 825 阅读 · 0 评论 -
SuspendThread和ResumeThread函数
操作系统对线程有几种状态的变化:执行,挂起和恢复执行。当线程做完任务或者现在想暂停线程运行,就需要使用SuspendThread来暂停线程的执行,当然恢复线程的执行就是使用ResumeThread函数了。这两个函数使用很简单的,下面就来看看例子是怎么样使用的。 函数SuspendThread和ResumeThread声明如下:WINBASEAPIDWORDWINAPIS原创 2012-05-07 10:53:41 · 551 阅读 · 0 评论 -
CreateSemaphore和ReleaseSemaphore函数
在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情。在这其中,就需要使用到信号量来进行同步。CreateSemaphore是创建信号量,ReleaseSemaphore是增加信号量。 函数CreateSemaphore和ReleaseSemaphore声明如下:WINBASEAPI__out原创 2012-05-07 10:56:53 · 813 阅读 · 0 评论 -
WaitForSingleObject函数
上面已经介绍怎么样创建一个简单的线程,在那里就需要使用函数WaitForSingleObject,它是用来做什么的呢?其实它是用来实现等待线程结束的,它的机理是这样的,通知Windows操作系统,现在我进入睡眼状态,当我关注的对象条件是否满足,如果满足了就吵醒我。在那里关注的对象是线程是否退出,这是一个条件测试。如果不等待线程关闭,就去删除线程的资源,就会出错的。使用前面的线程是简单一些,但它不合原创 2012-05-07 11:01:29 · 443 阅读 · 0 评论 -
FindWindowEx函数
当你想控制一个现有的窗口程序时,就需要获取那个程序的窗口句柄。比如有一些黑客软件需要查找到窗口,然后修改窗口的标题。在外挂流行的今天,惊奇地发现它们也可以修改输入窗口的文字。这其中,就需要使用到FindWindowEx函数来定位窗口。下面就来使用这个函数来实现控制Windows里带的计算器程序。打开计算器程序,最小化在状态下面,运行本例子,点击创建按钮后,就可以点按钮,就会把计算器显示在最前面。原创 2012-05-07 11:03:33 · 743 阅读 · 0 评论 -
ExtCreatePen函数
使用前面介绍的CreatePen函数来画大于1的直线时,会发现直线两端全是圆角的,有时候需要画得有角,那么这样的函数就不满足需求了,这时就需要使用另一个API函数ExtCreatePen来创建合适的画笔。ExtCreatePen函数可以创建几何画笔,还可以创建装饰用的画笔,装饰的画笔是用来画一些图案使用的,这样就需要快速的算法来实现,显示比几何的画笔在速度上快很多。比如你在画GPS地图时,当需要装原创 2012-05-07 11:10:43 · 473 阅读 · 0 评论