自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(97)
  • 资源 (8)
  • 收藏
  • 关注

转载 Windows API一日一练(86)GetClipboardData函数

前面介绍怎么样把数据放到剪贴板里面,那么又是怎么样从剪贴板里面获取数据出来呢?当然还是需要使用其它的API函数来获取剪贴板里的数据。获取剪贴板里的数据时,是不知道当前剪贴板里是否有数据的,也不知道剪贴板里的数据格式是什么。那么下面就来解决这两个问题,先使用函数IsClipboardFormatAvailable来获取剪贴板里的格式是否可以处理,接着使用函数OpenClipboard打开剪贴板,然后

2008-05-08 23:16:00 685

转载 Windows API一日一练(85)OpenClipboard函数

多个软件之间进行数据共享是非常重要的,难以想像编辑软件没有CTRL+C,CTRL+V的功能,是多么的不方便。很多的操作,就是拷贝的动作,就是为了数据共享。剪贴板共享是Windows里比较重要的功能,比如很多采集数据的软件为了方便导数据到Excel里面,就可以使用剪贴板的功能。还有即见即所得的界面导到Word里面,也可以使用剪贴板的功能。 函数OpenClipboard声明如下: WINUSERAP

2008-05-08 23:06:00 632

原创 Windows API一日一练(84)FlushInstructionCache函数

一般的程序都是在运行前已经编译好的,因此修改指令的机会比较少,但在软件的防确解里,倒是使用很多。当修改指令之后,怎么样才能让CPU去执行新的指令呢?这样就需要使用函数FlushInstructionCache来把缓存里的数据重写回主内存里去,让CPU重新加载新的指令,才能执行新的指令。下面就来学习一下使用这个函数来实现跳到一个静态函数里执行,而不是直接地调用这个函数。 函数FlushInstruc

2008-05-03 00:41:00 901

转载 Windows API一日一练(83)GetModuleFileName函数

在开发软件的过程里,经常需要把数据保存到当前执行文件路径下面,或者读取当前执行文件路径下的一些配置信息。这时就需要从当前模块里获取所在的目录路径,以便进行固定的位置操作文件。要解决这个需求,就需要调用API函数GetModuleFileName来获取模块所在的路径。 函数GetModuleFileName声明如下:WINBASEAPIDWORDWINAPIGetModuleFileNameA(  

2008-05-03 00:39:00 604

转载 Windows API一日一练(81)LoadLibrary函数

随着软件规模的扩大,要求的功能也是越来越多,开发人员的参与也是越来越多。因此软件的功能划分,就成为了现代软件工程的重大任务,还有软件开发的并行性也越来越重要。为了解决这些问题,大家都会看到IT硬件发展非常迅速,功能也越来越复杂,但硬件中发展明显提高在于采用IC的方式来实现复杂的功能,也就是把大部份功能集成到一起,只要给出一些引脚就可以实现产品了。而软件中有没有相同于硬件中的IC呢?我想是应有的,就

2008-04-29 22:18:00 724

转载 Windows API一日一练(80)FormatMessage函数

在开发软件的过程里,经常要做的工作就是调试程序,许多问题的出现,不但是逻辑的问题,还有可能是对API的不熟悉,或者某种条件下调用API会出错的。那么这些出错的原因是什么呢?通常只获取到错误码,也就是通过函数GetLastError得到。当然可以根据这个错误码去查找MSDN就可以知道出错的原因,但有时在客户那里并没有MSDN,那么就需要把调用API函数出错的信息显示出来,或者写到LOG里去。这时就需

2008-04-29 22:06:00 644

转载 Windows API一日一练(79)GlobalMemoryStatusEx函数

在开发软件的过程中,经常会碰到不同用户的PC系统配置不一样。比如有些用户的系统内存配置比较差,这样处理大量数据时,就不能把大量的数据读取到内存里处理了。而又有一些用户的内存比较多,或者是机器比较新,那么就可以加载大量的数据到内存里处理,这样可以随着系统的更新,软件的处理能力能大幅地提高性能。这样就需要了解系统的配置信息了,最重要的资源之一内存,就是最需要了解的,需要调用函数GlobalMemory

2008-04-27 10:03:00 655

转载 Windows API一日一练(78)HeapAlloc函数

前面已经介绍两个分配内存的函数,一个全局的内存分配,一个是私有的内存分配。在进程私有的内存里分配里,又有两种分配情况,一种上基于栈式的内存分配,另一种是基于堆内存的分配。在c++里使用堆内存分配是使用HeapAlloc函数来实现的,也就是实现new操作符分配内存时会调这个函数。 函数HeapAlloc声明如下:WINBASEAPI__bcount(dwBytes)LPVOIDWINAPIHeapA

2008-04-27 09:57:00 1473 1

转载 Windows API一日一练(77)VirtualAlloc函数

上一次学习了全局内存的分配,在Windows里内存管理是分为两部份,全局内存是系统管理的内存,因而所有进程都可以访问的内存,而每一个进程又有自己的内存空间,这就是虚拟内存空间了,而虚拟内存的空间比较大,当物理内存不足时,系统会把虚拟内存的数据保存到硬盘里,这样只要硬盘的空间足够大,每个进程就可以使用3G的内存。虚拟内存分配可以作为程序里分配内存的主要方式,比如大量的数据缓冲区,动态分配内存的空间。

2008-04-26 14:40:00 1478

转载 Windows API一日一练(76)GlobalAlloc函数

在Windows系统里,有一项功能非常实用,就是剪贴板功能,它能够从一个程序里与另一个程序进行数据交换的功能,也就是说两个进程上是可以共享数据。要实现这样的功能,Windows系统在底层上有相应的支持,就是高端地址的内存是系统内存,这样就可以不同的进程进行共享数据了。因此,调用函数GlobalAlloc来分配系统内存,让不同的进程实现共享数据,也就是剪贴板功能,可以在一个进程内分配内存,在另一个进

2008-04-26 14:37:00 778

转载 Windows API一日一练(75)SystemParametersInfo函数

面对华丽的Windows桌面,工作的心情或许好很多,但是久了总会失去兴趣,总想定期地更新桌面的图片。软件开发人员又面对这样的需求了,需要怎么样去做呢?努力去找API函数吧。到目前为止,还有很多变桌面图片的软件,并且还能很挣钱的。其实设置桌面图片的需求,在目前数码相片处理软件也有现实的需求,比如当你去旅游回来后,想把照片当作桌面图片,就可以在处理图片时就设置为桌面图片。这样就需要使用函数System

2008-04-25 21:44:00 862

转载 Windows API一日一练(74)GetSystemInfo函数

有一次,我正在开发一个视频压缩程序,而压缩算法是需要非常高效的,也就是需要使用到CPU的多媒体指令。在X86的领域里,目前主要有两家CPU,就是INTEL和AMD。它们的多媒体指令是不一样的。为了区分这种不同的指令,就需要调用函数GetSystemInfo来获取CPU的信息,然后再调用不同的动态连接库来进行多媒体数据压缩。 函数GetSystemInfo声明如下: WINBASEAPIVOIDWI

2008-04-25 21:42:00 601

转载 Windows API一日一练(73)GetVersionEx函数

Windows发展还是非常快速的,从Win95,到Win98,再到Win2000和XP系统。每个系统的功能也有所不同,要想在程序里区别不同的系统,就需要获取系统的版本信息。比如XP里有防火墙,而其它以前的系统里没有带有的。但有时编写了一个服务器程序,或者编写BT程序,又需要设置一个端口对外面接收连接,因此在XP系统里就需要设置防火墙的端口,而在XP以前的系统里就没有必要设置端口了。这样的需求,就可

2008-04-23 18:28:00 595

转载 Windows API一日一练(72)GetUserName函数

需要识别当前的用户是什么帐号登录了,然后再作出权限分配。还有出错时,也需要对当前帐号进行记录下来,因为不同的帐号有不同的权限,有些磁盘是不允许操作的。面对这些需求,就需要使用函数GetUserName。 函数GetUserName声明如下: WINADVAPIBOOLWINAPIGetUserNameA (    __out_ecount_part(*pcbBuffer, *pcbBuffer)

2008-04-23 18:25:00 628

转载 Windows API一日一练(71)GetComputerName函数

当你在一个大公司里面,当一个网络管理员时,发现成千上万个电脑需要你去管理时,怎么去区分这些电脑呢?那肯定是通过计算机的名称。而这个网络管理员又需要你开发一套软件,它可以把所有电脑的名称自动地上报给他。面对这样的需求,就可以使用下面的函数GetComputerName来获取计算机的名称,并通过网络传送给管理员。 函数GetComputerName声明如下: WINBASEAPIBOOLWINAPIG

2008-04-22 22:47:00 2774

转载 Windows API一日一练(70)GetSystemTime和GetLocalTime函数

时间是一个非常重要的信息,比如写LOG时,就需要把时间输出来,跟踪程序是什么时候出错的。或者当你开发一个银行交易系统时,就要记录当前交易的时间,以便后面可以输出报表,打印给信用卡用户。根据不同的需求,可能需要使用不同的时间,目前有UTC和本地时间。UTC是格林威治时间,也就是全球标准时间。本地时间就是相对于UTC而言的,比如中国北京是在东8区,相对于UTC就多了8个小时。一般使用到的时间都是使用本

2008-04-22 22:13:00 794

转载 Windows API一日一练(69)GetTickCount函数

时间计时,也不是越精确越好,有时只需要有一个计时就行了。这样就可以使用毫秒级别的计时函数GetTickCount。这个函数是记录了系统启动以来的时间毫秒,当超过49.7天,这个值变为从0开始,也就是说49.7天是一个周期。当不同的两次函数调时,就返回两次时间差值。 函数GetTickCount声明如下: WINBASEAPIDWORDWINAPIGetTickCount(    VOID    )

2008-04-21 14:29:00 745 1

转载 Windows API一日一练(68)QueryPerformanceCounter函数

精确的时间计时,有时候是非常必要的。比如播放多媒体时视频与音频的时间同步,还有在测试代码的性能时,也需要使用到非常精确的时间计时。还有测试硬件的性能时,也需要精确的时间计时。这时就需要使用QueryPerformanceCounter来查询定时器的计数值,如果硬件里有定时器,它就会启动这个定时器,并且不断获取定时器的值,这样的定时器精度,就跟硬件时钟的晶振一样精确的。 函数QueryPerform

2008-04-21 14:27:00 912

转载 Windows API一日一练(67)SetTimer和KillTimer函数

在前面介绍了一对定时器的API函数使用,现在又介绍另外一对API函数的使用。它使用起来比前的函数要简单一些,但它一般是使用到有窗口的程序里,并且它的精度也没有前面的API函数高,对于一些要求不高的场合还是非常合适的。它是采用消息通知的方式,每当定时到了就会收到一条消息。 函数SetTimer和KillTimer声明如下: WINAPISetTimer(    __in_opt HWND hWnd,

2008-04-19 16:21:00 759

转载 Windows API一日一练(66)CreateWaitableTimer和SetWaitableTimer函数

用户感觉到软件的好用,就是可以定时地做一些工作,而不需要人参与进去。比如每天定时地升级病毒库,定时地下载电影,定时地更新游戏里的人物。要想实现这些功能,就可以使用定时器的API函数CreateWaitableTimer和SetWaitableTimer来实现了,这对API函数创建的时钟是比较精确的,可以达到100倍的10亿分之一秒。 函数CreateWaitableTimer和SetWaitabl

2008-04-19 16:17:00 645

转载 Windows API一日一练(65)RegQueryValueEx函数

上一次介绍怎么样保存数据到注册表里,这次就需要从注册表里读取数据出来了。在这个例子里是读取字符串数据出来,主要调用函数RegQueryValueEx来实现。下面的例子里就是先查询键值的长度,然后再读取内容出来。 函数RegQueryValueEx声明如下: WINADVAPILONGAPIENTRYRegQueryValueExA (    __in HKEY hKey,    __in_opt

2008-04-18 11:59:00 564

转载 Windows API一日一练(64) RegSetValueEx和RegDeleteValue函数

上一次说到怎么创建注册表的键,但接着下来的问题就是怎么样保存数据到注册表里。注册表使用树形的方式管理数据,所以它的扩展和访问都是比较灵活的。不过注册表是系统重要信息库,每当Windows系统加载时,都首先从硬盘里读取它出来,才知道每台电脑所有硬件配置信息,然后再加载不同的驱动程序。因此,注册表作为系统重要的文件,不要往里面写超过2K的数据大小,这样可以提高系统的速度。下面就来介绍一下怎么样保存一个

2008-04-18 11:55:00 703

转载 Windows API一日一练(63)RegOpenKeyEx和RegCreateKeyEx函数

由于电脑经常会关闭,或者应用程序也会经常关闭,但有一些参数是经常需要保存。比如当你打开程序,并设置了窗口的大小,想每次打开时都设置窗口为上次打开的大小。这样就需要保存窗口的大小,那么窗口大小的参数保存到那里呢?其实在Windows里最方便的做法,就是保存到注册表里。又比如游戏登录时,总是想保存最后一个登录的用户,那么也需要保存这个用户到注册表里。其实注册表是Windows保存系统配置的数据库,比如

2008-04-17 13:07:00 548

转载 Windows API一日一练(62)GetDiskFreeSpaceEx函数

有一次客户给我打来了投诉电话,说我的软件太不好用了,导致他们丢失了很多数据。后来我仔细地查看LOG,分析出来的原因,其实是很简单的,就是磁盘的空间不够了。我给客户说他们的电脑磁盘空间不够了导致出错的问题,但客户反问我为什么不提示磁盘空间不足。是啊,为什么不提示磁盘的空间不足呢?为了解决这个需求,就需要使用到这个函数GetDiskFreeSpaceEx。 函数GetDiskFreeSpaceEx声明

2008-04-17 13:01:00 488

转载 Windows API一日一练(61)GetDriveType函数

经常碰到这样的需求,比如你需要保存一个文件到一个目录里去,这个目录或许是用户指定的目录,那么你就需要确保这个目录是否有效的,这样就需要去测试这个目录是否允许写文件?这个目录是否存在?这个目录是否可写的?或者这个目录是否网络上的目录?要完成这个任务,就得使用函数GetDriveType来完成。GetDriveType函数可以获取目录和盘号的属性。 函数GetDriveType声明如下: 

2008-04-16 22:39:00 522

转载 Windows API一日一练(60)CreateIoCompletionPort和GetQueuedCompletionStatus函数

在Windows系统里,使用完成端口是高性能的方法之一,比如把完成端口使用到线程池和网络服务器里。现在就通过线程池的方法来介绍怎么样使用完成端口,高性能的服务器以后再仔细地介绍怎么样构造它。其实完成端口是一个队列,所有的线程都在等消息出现,如果队列里有消息,就每个线程去获取一个消息执行它。先用函数CreateIoCompletionPort来创建一个消息队列,然后使用GetQueuedComple

2008-04-16 22:29:00 549

转载 Windows API一日一练(59)CreateFileMapping和MapViewOfFile函数

在开发软件过程里,也经常碰到进程间共享数据的需求。比如A进程创建计算数据,B进程进行显示数据的图形。这样的开发方式可以把一个大程序分开成独立的小程序,提高软件的成功率,也可以更加适合团队一起开发,加快软件的开发速度。下面就来使用文件映射的方式进行共享数据。先要使用函数CreateFileMapping来创建一个想共享的文件数据句柄,然后使用MapViewOfFile来获取共享的内存地址,然后使用O

2008-04-15 23:33:00 529

转载 Windows API一日一练(58)FindFirstFile和FindNextFile函数

在开发软件的过程里,经常需要维护目录里的数据。比如在开发银行的信用卡系统里,由于每天创建的LOG非常多,那么一个很大的硬盘,在6个月后,就占用了很多空间。这时就有这样的一个需求,把所有超过6个月的LOG数据定期删除掉。要实现这个功能就得遍历整个目录,把文件名称和文件创建的时间都超过6个月时间的文件删除掉。因此,就需使用到下面的API函数FindFirstFile和FindNextFile来实现这样

2008-04-15 23:31:00 631

转载 Windows API一日一练(57)CopyFile和MoveFile函数

在信息的社会里,共享信息是非常重要的。比如你有一个很好的相片,要拷给朋友去分享。又或者你在写一些比较重要的数据,要进行不定时备份时,也就需要拷贝文件到不同的目录里。这样就需要使用到函数CopyFile来拷贝文件,它能够把一份文件拷贝多一份出来。我在开发一个数据采集的软件里,由于这个软件是可以不同的用户共同使用,用户跟我说有这样的需求,就是不同的用户的数据移动到不同的目录里,这样方便他们管理数据,也

2008-04-14 18:03:00 605

转载 Windows API一日一练(56)SetEndOfFile和GetFileSizeEx函数

有一天,我正在开发BT软件,它有这样的一个功能,就是先把文件的大小分配好,然后再慢慢地往里面对应的位置写入相应的数据。这样的好处,就是可以先把磁盘空间占用起来,以便后面的下载顺利进行。要实现这个功能,就需要创建一个空的文件,然后把文件指针设置到相应大小的位置,然后再调用函数SetEndOfFile来设置文件的结束位置,这样文件就有相应的大小了。在BT软件的开发里,也发现目录的处理时需要详细地记

2008-04-14 12:55:00 624

转载 Windows API一日一练(55)FlushFileBuffers和SetFilePointer函数

在PC硬件体系结构里,速度最快的存储器是CPU里面的寄存器,接着到二级缓存,再到系统RAM内存,最后才到硬盘。由于这样的体系结构,就决定了操作系统对文件的操作方式,或者说是最优化的算法。比如操作系统接收到写文件的数据时,就会先把数据保存到RAM里,然后在合适的时间或者合适的数据量时再写到硬盘里。但有时候我们希望数据一定要保存到硬盘里,而不是保存在RAM里,这时就需要使用函数FlushFileBuf

2008-04-13 15:48:00 1605

转载 Windows API一日一练(54)WriteFile和ReadFile函数

读写文件是每个Windows软件开发人员都需要做的工作。可见这项工作是非常重要的,毕竟各种各样的数据都需要保存起来,以便作各种各样的分析,或者通过网络传送给别人。像大家用BT下载的电影,在那个BT软件里,就需要不断从网络里接收到数据,然后再把这些数据保存到文件里合适的位置,就可以生成跟发行者那里一样的文件,这样才可以播放出来。又比如我在玩《征途》的游戏里,刚刚打开游戏时,它就不断从服务器上下载更新

2008-04-13 14:23:00 1354

翻译 DirectX 下面的多窗口

Introduction In DirectX 8, support for rendering to multiple windows is provided through the creation of additional swap chains. However, there are currently no examples of this in the SDK, and the

2008-04-13 13:29:00 1623

原创 ORACLE常用命令

             一、ORACLE的启动和关闭            1、在单机环境下            要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下            su - oracle            a、启动ORACLE系统            oracle>svrmgrl            SVRMGR>connect intern

2008-04-12 12:40:00 1892 2

转载 Windows API一日一练(53)CreateFile函数

在软件的需求里,把有用的数据保存起来是非常重要的功能。比如每天的股票行情数据需要保存起来,以便生成K线图。比如游戏客户端的LOG需要保存起,以便客户端出错时可以把LOG发送回来分析它出错的原因。比如银行每天进行交易时,也需要把所有交易的数据保存到文件备份起来,以便进行结算。还有在数据采集领域更是需要保存更多的数据,比如从DV里读取视频和语音数据出来,就会生成12G的巨型文件。比如读DVD光盘里,把

2008-04-12 12:32:00 555

转载 Windows API一日一练(52)GetCurrentDirectory和SetCurrentDirectory函数

在开发软件里,常常碰到要读取当前目录下的配置参数文件,或者打开当前目录下别的程序来运行,那么就需要获取当前进程的目录位置,这就需要使用函数GetCurrentDirectory获取当前进程所有在的目录。同时也可以使用SetCurrentDirectory函数来改变进程的当前目录。 函数GetCurrentDirectory和SetCurrentDirectory声明如下: WINB

2008-04-12 12:19:00 475

转载 Windows API一日一练(51)CreateDirectory和RemoveDirectory函数

在信息爆炸的年代里,把各种信息分类已经是一种非常必要的功能,比如把股票行情数据保存到硬盘里,就需要分开几个目录保存。比如你写LOG到硬盘时,也需要分成几个目录来保存,这样让维护人员很好地找到出错的信息,或者有用的信息。像我在开发银行的信用卡系统时,就需要把所有通过网络传送的数据全部生成文本文件保存到当日的目录里,也就是说每天都需要创建一个目录,把所有交易的数据生成LOG保存进去。那么面对这样的需求

2008-04-11 23:45:00 500

转载 Windows API一日一练(50)SuspendThread和ResumeThread函数

操作系统对线程有几种状态的变化:执行,挂起和恢复执行。当线程做完任务或者现在想暂停线程运行,就需要使用SuspendThread来暂停线程的执行,当然恢复线程的执行就是使用ResumeThread函数了。这两个函数使用很简单的,下面就来看看例子是怎么样使用的。 函数SuspendThread和ResumeThread声明如下:WINBASEAPIDWORDWINAPIS

2008-04-11 23:43:00 817 1

转载 Windows API一日一练(49)SetThreadPriority和GetThreadPriority函数

Windows是抢先式执行任务的操作系统,无论进程还是线程都具有优先级的选择执行方式,这样就可以让用户更加方便处理多任务。比如当你一边听着音乐,一边上网时,这时就可以把音乐的任务执行级别高一点,这样不让音乐听起来断断续续。当你编写网络程序时,一个线程从网络接收数据,一个线程写数据到硬盘,这时也可以把网络接收线程的优先级设置高一点,因为可以把接收到的数据写到内存里去,然后缓存起来再写到硬盘里。还有一

2007-12-08 20:39:00 538

转载 Windows API一日一练(48)PostThreadMessage函数

在写服务器程序里,很多地方都需要使用到线程池。特别现在多处理器的CPU越来越普及,使用多个线程池是明显提高服务器程序的性能。在以消息为基础的Windows系统里,使用消息来处理是最简单的线程池办法,不但使用起来简单,而且理解起来也很简单的方法。创建多个线程后,就可以根据线程的ID来向不同的线程发送消息,每个线程都处理自己的消息。而发送消息给线程的函数是PostThreadMessage函数。下面来

2007-12-06 12:16:00 523

802.1Q协议、802.1Q协议

802.1Q、802.1Q、802.1Q、802.1Q

2010-04-10

启动IIS出现0x8ffe2740错误的解决办法

启动IIS出现0x8ffe2740错误的解决办法

2010-02-16

[PPT]厦门大学数据结构课件

[PPT]厦门大学数据结构课件[PPT]厦门大学数据结构课件

2010-01-31

[PDF]厦门大学数据结构课件

[PDF]厦门大学数据结构课件[PDF]厦门大学数据结构课件[PDF]厦门大学数据结构课件

2010-01-31

戏说面向对象程序设计C#版戏说面向对象程序设计C#版

戏说面向对象程序设计C#版戏说面向对象程序设计C#版戏说面向对象程序设计C#版

2010-01-31

sql中的触发器和分页显示

sql中的触发器和分页显示sql中的触发器和分页显示sql中的触发器和分页显示sql中的触发器和分页显示

2010-01-31

OllyDbg完全教程OllyDbg完全教程

OllyDbg完全教程OllyDbg完全教程OllyDbg完全教程OllyDbg完全教程OllyDbg完全教程

2010-01-31

华为面试经典题目系列

华为面试题华为面试题华为面试题华为面试题华为面试题

2010-01-31

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除