API函数范文
API函数范文(精选5篇)
API函数 第1篇
1 利用AP I函数进行多线程编程
1.1 多线程的创建
使用Windows API函数CreateThread创建多线程[2]。其函数原型为:
CreateThread第三个参数是函数指针,新线程建立后将执行该函数,函数执行完毕,系统将销毁此线程从而结束多线程。CreateThread要使用的函数是系统级别的,所以后面要缀上stdcall(stdcall是协调参数顺序的)。当然,我们也可用BeginThread创建多线程。其实BeginThread是Delphi对CreateThread进一步的封装,内部实现时用到了CreateThread。
1.2 线程的挂起和恢复
挂起函数,Function SuspendThread(HThread:Thandle):DOWRD
恢复函数,Function ResumeThread(HThread:THandle):DWORD;
ResumeThread和SuspendThread分别对应TThread的Resume和Suspend方法。它们分别负责线程的挂起和唤醒。线程可以挂起自己,但不能自己恢复运行,必须由其它线程恢复它的运行。处于挂起状态的线程占用的CPU时间几乎为0,系统也不会分配时间片给它。
1.3 线程优先级
Win32 API函数Get ThreadPriority和Set ThreadPriority可以获取或设定线程的优先级。这两个函数均以线程句柄为参数。线程的优先级取决于所属进程的优先级和线程的相对优先级。
在Delphi中,TThreadPriority定义的类型为[3]:
type TThreadPriority=(tpIdle,tpLowest,tpLower,tpNormal,tp Higher,tp Highest,tpTimeCritical);
其中,tpIdle优先级最低,tpTimeCritical优先级最高。
1.4 线程的终止
我们可在线程内部调用API函数ExitThread(ExitCode)终止线程[4]。调用Get ExitCodeThread函数获取线程退出码,如果退出码是常量STILL_ACTIVE,表明线程还未退出。当我们获取了退出码后,就可在线程内部调用ExitThread(ExitCode)终止线程了。当然我们也可等待线程所属的进程终止。第三种方式是在线程外部调用API函数TerminateThread,使线程立即停止,但分配的资源不会被释放。调用此函数前,可先将线程挂起再终止线程。除非万不得已,最好不要用此函数终止线程。特别注意Exit Thread和TerminateThread的区别:一个是在线程内部终止线程;一个是在线程外部终止线程。
2 利用Windows AP I实现线程同步
在程序中有多个线程的情况下,为避免访问冲突,就要用到“同步”技术。“同步”的实质就是协调多线程之间的关系,控制它们对重要代码和数据的访问,使它们不发生冲突,有次序、依次执行彼此各自的代码,而不是真的线程都在“同步”发生。同步技术主要有临界区、互斥、信号量、事件等手段。
2.1 临界区(Critica l S e ction)
所谓临界区,就是某个线程独占敏感的共享资源,保护敏感的共享资源不被其他线程操作访问。在没有释放临界区前,其他线程只有挂起等待。只有在释放了临界区后,其他线程才可以对敏感的共享资源进行操作访问。
在使用临界区时,必须调用API函数InitializeCriticalSection对线程对象进行初始化。在每次要访问共享数据之前调用EnterCriticalSection设置进入临界区标志,然后再操作。相应地,要调用Leave Criti cal Section离开临界区。这样就避免了访问冲突。
最后,当不再使用临界区后,要记得在程序中适当的地方使用Delete CriticalSection来删除临界区。
2.2 互斥(Mute x)
互斥内核对象能够保证多个线程对同一共享资源的互斥访问,各线程都可以拥有它,谁拥有谁就能执行。由于互斥对象只有一个,拥有互斥对象的线程才具有访问共享资源的权限,因此共享资源就不会同时被多个线程所访问。当占据资源的线程完成任务处理后,就将拥有的互斥对象释放,以供其它线程能够访问共享资源。
使用互斥对象首先要通过CreateMutex或OpenMutex函数创建或打开一个互斥对象。然后,在一个线程中,当线程访问共享资源前,调用Wait ForSinglObject或Wait FroMutipleObject函数请求占用互斥对象,当线程访问共享资源结束后,通过ReleaseMutex函数来释放其拥有的互斥对象。当互斥对象使用完毕,调用Close Handle函数把它关闭。
在此,介绍下等待函数Wait ForSingleObject:
Wait ForSingleObject的第二个参数一般给常数值INFINITE,表示一直在等待。
函数Wait ForSingleObject的返回值是:
WAIT_OBJECT_0指定对象处于发信号状态;
WAIT_TIMEOUT等待时间到了,指定对象仍处于非发信号状态;
WAIT_ABANDONED互斥对象被抛弃,指定对象被改为非发信号状态。
2.3 信号量(S e ma phore)
信号量内核对象支持同时多个线程对共享资源的访问。在创建对象时,可指定最大同时访问共享资源的线程数和初始线程数。在信号量内核对象中,每增加一个对共享资源进行访问的线程,当前资源计数就会减1。调用ReleaseSemaphore函数后,当前资源计数就会加1。如果正在访问的线程数少于指定的信号总数,则新线程就可访问该共享资源,否则就必须等待其他线程访问完毕才可以。
使用信号量内核对象进行线程同步主要会用到CreateSemaphore、OpenSemaphore、ReleaseSemaphore、Wait ForSingleObject和Wait ForMultipleObjects等函数。最后,也要调用Close Handle函数释放信号量对象。其中,CreateSemaphore用来创建一个信号量内核对象,其函数原型为:
2.4 事件(Eve nt)
Event(事件对象)是多线程最简单的同步手段。和其他同步手段相比,它有启动函数Set Event和暂停函数ResetEvent。有意思的是,它还有个"单步"执行一次的函数PulseEvent,能控制执行一次后暂停。其函数原型为:
3 多线程同步举例
为说明多线程同步技术的特点,给出一个多线程同步的完整源代码,以供参考。当然,以下的源代码很简单,只是在画布上以不同的颜色画椭圆,但它很能说明同步技术的特点。
4 结束语
多线程编程及其同步方法,是Delphi的核心高级编程技术。熟练掌握利用Win32的API函数操作多线程编程及其同步方法,能帮助我们编制高效简洁的多线程应用程序。
摘要:文章讨论了在delphi下利用API函数操作多线程及其同步技术,并举例说明。
关键词:多线程,同步方法,API
参考文献
[1]乔林.参透Delphi/Kylix[M].北京:中国铁道出版社,2003.
[2]Microsoft Corporation.Microsoft Win32程序员参考大全[M].北京:清华大学出版社,1995.
[3]Steve Teixeira,Xavier Pacheco著,徐新华译.Delphi 4开发大全[M].北京:人民邮电出版社,1999.
API函数 第2篇
在VB中使用API函数 (之一)
什么是API?
API(Advanced Programmers Interface,高级程序员接口)(注:API实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以Windows告诉发生了什么.
这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法.
这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数.
同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click).
API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll...).
API 声明
正如在“什么是API”中所说,API函数包含在位于系统目录下的DLL文件中.你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer.
要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32api.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),选择“声明”,找到所需函数,点击“添加(Add)”并“复制(Copy)”,然后粘贴(Paste)到你的工程里.使用预定义的常量和类型也是同样的方法.
你将会遇到一些问题:
假设你想在你的窗体模块中声明一个函数.粘贴然后运行,VB会告诉你:编译错误...Declare 语句不允许作为类或对象模块中的 Public 成员...看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(如 Private Declare Function...).--不要忘了,可是这将使该函数只在该窗体模块可用.
在有些情况下,你会得到“不明确的名称”这样的提示,这是因为函数.常量或其他的什么东西共用了一个名称.由于绝大多数的函数(也可能是全部,我没有验证过)都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行.
你可以通过查看VB的Declare语句帮助主题来获取有关Alias的详细说明.
消息(Messages)
好了,现在你已经知道什么是API函数了,但你也一定听说过消息(如果你还没有,你很快就会)并且想知道它是什么.消息是Windows告诉你的程序发生了哪些事件或要求执行特定操作的基本方法.例如,当用户点击一个按钮,移动鼠标,或是向文本框中键入文字时,一条消息就会被发送给你的窗体.
所有发送的消息都有四个参数--一个窗口句柄(hwnd),一个消息编号(msg)还有两个32位长度(Long)的参数.
hwnd即要接受消息的一个窗口的句柄,msg即消息的标识符(编号).该标识符是指引发消息的动作类型(如移动鼠标),另外两个参数是该消息的附加参数(例如当鼠标移动时光标的当前位置)
但是,当消息发送给你时你为什么看不到呢--就象有人在偷你的信一样?请先别恼火,让我告诉你.
小偷其实是Visual Basic.但它并没有偷走你的信,而是在阅读了之后挑出重要的以一种好的方式告诉你.这种方式就是你代码中的事件(Event).
这样,当用户在你的窗体上移动鼠标时,Windows会发送一条WM_MOUSEMOVE消息给你的窗口,VB得到这条消息以及它的参数并运行你在事件MouseMove中的代码,同时VB会把这条消息的第二个32位数(它包含了x,y坐标,单位为像素(Pixel),每个位16位)转换为两个单精度数,单位为缇(Twip).
现在,如果你需要光标坐标的像素表示,然而VB已经把它转换成了缇,因此你需要重新把它转换为以像素为单位.在这里,Windows给了你所需要的,但VB“好意地”进行了转换而使你不得不重新转换.你可能会问--我难道不能自己接收消息吗?答案是肯定的,你可以使用一种叫做子类处理(Subclass)的方法.但你除非必须否则最好不要使用,因为这与VB的安全程序设计有一点点的违背.(注:子类处理确实有很大的风险,但如果使用得当,是很有用处的.不过有一点一定要注意,即千万不要使用VB的断点调试功能,这可能会导致VB崩溃!)
需要补充说明的是:你可以发送消息给你自己的窗口或其他的窗口,只需调用SendMessage或PostMessage(SendMessage会使接受到消息的窗口立刻处理消息,而PostMessage是把消息发送到一个称为消息队列的队列中去,等候处理(它将会在该消息处理完后返回,例如有些延迟)).你必须制定接受消息的窗口的句柄,欲发送消息的编号(所有的消息的编号均为常量,你可以通过API Text Viewer查得)以及两个32位的参数.
API函数 第3篇
1 算法原理
马赛克效果的图片显示的基本思想就是将图片从形式划分为很多小块,然后利用Bitblt函数随机地拷贝这些图片块,并显示出来的动态过程。
1.1 图块大小的确定
图块的大小是否合适会直接影响图片的显示效果。可以在属性窗口查看原图的ScaleHeight和ScaleWidth的属性值得到原图的尺寸。根据需要划分的图块数目,确定小图块的尺寸。但是这样进行小图块尺寸的确定有些繁琐。为此可采用一个比较简单的办法,先将原图横向分为N块,然后用(1)式计算,得到纵向块图块的数目M,进而可以得到全部图块的总数。
M=N图片.ScaleHeight/图片.ScaleW-
假设原图片大小为347255像素,按以上计算得到M=11,即纵向分为11个图块,图块总数为165,每图块像素值为2323。
1.2 各图块坐标的确定
在Visual Basic的绘图系统中,窗体的左上角为坐标原点。由于图片是二维的,为了表示这些图块的位置,可以使用两个二维数组与之对应。可以将图块左上角的横坐标表示为(2)式。
同样图标的纵坐标的数组表示与式(2)类似。下面以横向15个图块、纵向11行,每块宽23像素为例给出图块横、纵坐标的坐标值如表1所示。
结合数学公式,可以将图块的横、纵坐标表示为式(3)。
其中Px为数组中是图块横坐标的数值,Py为数组中是图块纵坐标的数值。
照马赛克的出图效果出图时,各图片的出现顺序是随机的,这是一种随机选号出图的方式。从图块编号的角度来看,图块编号是从1~n,图块编号是一维的,在这种情况下以Xm,M、Ym,n的方式进行选号出图在程序的设计上有所不便。因此可以将各图块的坐标事先赋给表示这个图块坐标的变量,然后在显示图片时按照对应图块的坐标确定这个图块的显示位置,在程序的实现上就方便多了。
1.3 随机数的产生
由于马赛克是随机选号出图的,在各号图块的坐标确定之后,则需要考虑如何能生成以起始图号和终止图号为闭区间的,互不重复的涵盖所有图块编号的随机数序列。
将随机生成的n个随机的整数存放在数组中,再用数组中的n个数据与图片中的图块相对应,然后以数组的下标为序读出其中的数据,用于控制图块的复制与显示,就可得到马赛克形式的出图效果。流程如图1所示。
1.4 图块的随机复制
若将n个图块随机的显示出来,可以利用计时器控件,在一定的时间间隔后,利用存放在数组中的各图块的坐标,结合随机生成的图块号,就可以使用Bitblt函数[1]将一个完整的图片,随机的复制其图片块并显示出来。
2 实现
2.1 界面设置
在VB中新建只有一个窗体的工程文件,再在窗体上添加两个图片框控件,并按表2设置好控件的相应属性。
2.2 代码
在窗体中添加如下的程序段。
2.3 结果
系统运行后的界面如图2所示。
3 结束语
本文对在VB中用Bitblt函数实现图片的马赛克效果显示,API函数是一系列很复杂的函数,编程人员可以用不同的编程语言调用API函数,编写出在Windows操作系统中运行的应用程序。
参考文献
[1]赵文东,王素珍,赵杰.在VB中用Wi-nAPI函数放置″透明″的图片[J].西安:现代电子技术,2002(4):67-68.
[2]牛又奇,孙建国.Visual Basic程序设计教程[M].苏州:苏州大学出版社,2-002.
API函数 第4篇
本文以VB屏幕抓取程序的实现为实例,通过对API中BitBlt等函数的调用分析,阐述API函数在VB中的使用方法。
1 API函数概述
API (Application Programming Interface)即应用程序编程接口,是用C和C++编写,由操作系统或其它应用程序调用的函数。API函数由许多“动态链接库”DLL组成,这是Windows系统中一种特殊的可执行文件。常用的API函数动态链接库有:
Kernel.dll:Windows32位核心,主要对计算机系统资源(如多任务、内存、系统注册表等)进行操作。
Gdi32.dll:图形设备接口API库,主要对系统的图形图像进行操作。
User32.dll:用户接口例程库,主要对用户接口(如窗口管理、菜单、光标、通信等)进行操作。
Netapi32.dll:32位网络API库。
Winmm.dll:多媒体库,用于播放波形音频、MIDI音乐和数字式影像。
Winspool.dll:后台打印接口库,包含后台打印API调用函数。
在这些动态链接库中包含了不同数量的API函数,而且随着操作系统的更新,来自于第三的API函数不断涌现,以处理新的操作系统扩展。
2 VB调用API函数的方法
在VB程序中调用API函数时,必须先有Declare语句在代码窗口的“通用”段进行函数声明,以确定所使用的API函数的名称、所在库的文件名、函数中使用的参数及数据类型和参数传递方式、函数本身的数据类型。在声明之后,就可以把它当做VB自己的过程一样使用。
利用VB调用API函数的一般方法是:
第一步:从VB的“外接程序”菜单“外接程序管理器”选项中加载“API浏览器”
第二步:在打开的“API浏览器”中加载文本文件Win32api.txt,从中查找所需API函数的声明,并复制该声明
第三步:在VB应用程序中添加一个标准模块,并将前面复制的API函数的常数定义等复制到该标准模块中。如果直接在窗体模块或类模块中声明API函数,则需要在函数声明前加Private关键字。
3 在VB中应用API函数的实例
实例:通过API函数的调用实现VB的屏幕抓取功能
3.1 程序界面及功能要求
该程序控件使用了两个图片框控件Picture1和Piccopy,用于放置抓取的屏幕图片;一个水平滚动条Hscroll1和一个垂直滚动条Vscroll1,用于图片浏览位置的移动;一个通用对话框控件Commondialog1,用于保存抓取的图片。
功能简介:单击“抓取”菜单时,程序窗体隐藏,将屏幕当前画面复制到程序窗体的piccopy控件中,可以通过拖动滚动条观看piccopy控件中的整个图片,单击“存储文件”菜单,可将抓取的画面存储为图片文件。
3.2“抓取”菜单单击事件分析
API中的BitBlt函数功能是将一个设备描述表中的图片复制到另一个设备描述表中。这正是程序所需的功能。其书写格式为:
其中h DestDC表示目标设备句柄;hSrcDC表示源设备句柄;X, Y表示目标图像左上角的横、纵逻辑坐标值;nWidth, nHeight分别表示目标图像的宽度和高度;xSrc, ySrc表示图像左上角的横、纵逻辑坐标值;参数dwRop为光栅操作代码,表示复制方式,其取值如下所示。
BLACKNESS:所有输出变黑。
DSTINVERT:反转目标位图。
MERGECOPY:使用布尔AND操作符合并特征与源位图。
MERGEPAINT:使用布尔OR操作符合并特征与源位图。
NOTSRCCOPY:拷贝反转源位图到目标。
NOTSRCERASE:反转使用布尔OR操作符合并源和目标位图的结果。
PATCOPY:拷贝特征到目标位图。
PATINVERT:使用布尔XOR操作符合并目标位图和特征。
PATPAINT:使用布尔OR操作符合并反转源位图和特征。用布尔OR操作符合并这项操作结果与目标位图。
SRCAND:使用布尔AND操作符合并目标像素和源位图。
SRCCOPY:拷贝源位图到目标位图。
SRCERASE:反转目标位图并用布尔AND操作符合并这个结果和源位图。
SRCINVERT:使用布尔XOR操作符合并目标像素和源位图。
SRCPAINT:使用布尔OR操作符合并目标像素和源位图。
WHITENESS:所有输出变白。
需要注意:
1)从上表可知将源矩形区域直接拷贝到目标区域,应选中光栅操作参数中的VBSRCCOPY常数。
2) BitBlt函数使用时以Pixel(像素)为单位,而窗体及图片框控件的缺省单位是Twips,故需要将用到BitBlt函数的控件及窗体的单位都设为像素。
3)要抓取屏幕的画面,必须获取当前屏幕的句柄,在此又必须调用API中的另一个函数:GetDC;在抓取到屏幕画面以后,程序需要释放前面获取的屏幕句柄,为下一次抓取操作做准备,这又需要调用API中的ReleaseDC函数。
GetDC函数功能:获取指定窗口的设备场景,其格式为:GetDC (hwnd)
参数hwnd为将要获取的设备场景的窗口句柄,若为0,则要获取整个屏幕的DC。此函数获取的场景必须用ReleaseDC函数释放。
ReleaseDC函数释放由GetDC函数和GetWindowDC函数获取的指定设备场景。其格式为:ReleaseDC (hwnd, hdc) 。参数hwnd指出要释放的设备场景相关的窗口句柄;hdc指出要释放的设备场景的句柄。
3.3 实现代码
1)标准模块中API函数的声明
2) “抓图”菜单事件代码
4 用API函数时应注意的问题
调用API函数时稍有不慎就可能导致API编程错误,出现难于捕获或间歇性错误,甚至出现程序崩溃。为更好地利用API函数,应注意下列问题:
1) 指定“Option Explicit”以避免变量隐式声明带来的弊端;
2) 勿忘ByVal,确保函数声明的完整性;
3) 注意检查参数类型;
4) 跟踪检查参数、返回类型和返回值;
5) 对要求一个指向缓冲区的指针,以便从中载入数据的API函数,应预先初始化字符串,以免造成冲突。
5 结束语
VB以友好易学的可视化开发环境闻名于世,可以完成几乎所有Windows应用程序的编写,是人们学习计算机编程的首选语言。但是要开发具有专业水准的Windows应用程序,必须使用大量的API函数,使VB能够直接控制和处理计算机的系统参数和硬件资源。
在本实例中通过GetDC获取屏幕场景句柄,应用BitBlt函数的SRCOPY光栅运算,可直接将整个屏幕内容复制于图片框中,并作为位图文件加以保存。那么,如果用户想随心所欲实现区域获取,就需要更多API函数的支持(如GetCursorPos函数等)。另外,通过对BitBlt函数功能的挖掘,抓屏、图形变换、智力拼图等程序都将轻松实现。
参考文献
[1]宋伟, 吴建国.Visual Basic6.0高级编程[M].北京:清华大学出版社, 2002.
API函数 第5篇
1 原理
该函数的参数有两个:源文件和目标文件。在备份前通过比较源文件和目标文件的最后修改时间,判断是否真的需要备份。调用该函数时的各种结果将通过不同的返回值通知调用者,功能流程图如图1所示。
2 定义智能备份函数Backup
在New Items的New框中,选择DLL Wizard,输入以下代码:
把编译后生成的BackupIT.DLL复制到Windows系统的System32文件夹下,就可以调用了。
3 调用智能备份函数
源文件和目标文件名(可包含所在路径)作为参数由调用者给出,假设源文件位于程序所在文件夹的data子目录下,目标文件存放在D:xsglbackup下的以系统日期命名的目录下。
4 结语
API函数范文
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。


