看到易论坛上有很多新手朋友对API都不懂怎么使用,做为一个Windows 编程爱好者,如果不会用
Windows系统提供给我们的编程接口,那将是一件非常遗憾的事,鉴于此,本文作者以自身体会为基础,结
合易语言实例,深入浅出的讲解API在易语言中的使用,希望对新手朋友有所帮助.
什么叫API?
API全称为Application Programming Intererface,直译的话可叫它“应用程序接口”。它是Windows
开放给程序员的编程接口,使得在用户级别下可以对操作系统进行控制,也就是一般的应用程序都需要调
用API来完成某些功能,API说到底就是一系列的函数,我们可以把它理解为程序的子程序或子过程,只不过
它是系统本身提供给用户在进行高级编程中供其程序使用。
API能做什么?它起什么作用?
我们编写的程序通过调用它来达到操作系统的目地,它是系统提供给我们的编程接口,一个很经典的例子就
是我们要通过调用API函数ExitWindowsEx来关闭系统,它还为各编程语言间的融会贯通架起了桥梁.
我怎样才知道我要的功能可以用某个API实现?
当你要实现的功能与系统的功能有关时都尽量假设可以用API办到,首先你要知道一些常用的API的功
能,下面有提供一个API的文档,你可以浏览地看一下,以后程序要实现某功能你可以在里面找,另外,互联
网上是一个无限的知识库,你可以问百度(www.baidu.com),问Google,另外微软还提供了一个知识库叫
"MSDN",你也可以查看,具体你可以在网上搜下看.
在易中我该怎么使用API?
要全面了解和使用API,我们先应该了解下动态链接库(DLL)的调用机制,因为API其实就是封装在DLL里面的一系列的
函数;了解DLL调用机制的最好办法是就是我们自己写个DLL然后我们再在自己的程序中调用,说做就做,不知道你有没有
用过易写过DLL,没有也没关系,我们来练习一下:打开易语言,新建一"动态链接库",我们单击右键新建一个子程序,起
名叫"MyAPI"改好名字后,在名字编辑框里"回车"3下,这样就添加了3个空白参数,参数名和类型等可以按自己的实际需
要填写,最后说明一下,如果你要外面的程序可以调用,一定要把"公开"勾上,下面是我的示例代码:
==============================
.版本 2
.子程序 MyAPI, 整数型, 公开
.参数 提示信息, 文本型
.参数 按钮类型, 整数型
.参数 窗口标题, 文本型
返回 (信息框 (提示信息, 按钮类型, 窗口标题))
======================================
这样,带参数调用这个子程序后,程序就会根据传过来的参数调用易带的信息框命令,并返回结果给调用方
OK,我们把它编译出来存为"Mydll.dll",我们再新建一个窗口程序,先保存在"Mydll.dll"的同目录,然后点击左栏的"DLL命令"
在右栏的空白处单击右键,选择第一项"新DLL命令"来新建一个DLL命令,在这个新DLL命令的"DLL命令名"里写入一个便于理解的
名字,这里就叫"我的信息框",在"返回值类型"里写入我们在DLL里定以的类型"整数型",在"DLL库文件名"里写入我们的DLL名字
"Mydll.dll"在"DLL库中对应命令名"中写入我们在DLL中公开的子程序名"MyAPI",然后"回车"3下,添加3个参数,名称不一定要相
同,但类型一定要和我们在DLL里的子程序"MyAPI"一一对应,如下面的代码:
.DLL命令 我的信息框, 整数型, "Mydll.dll", "MyAPI"
.参数 提示信息, 文本型
.参数 按钮类型, 整数型
.参数 窗口标题, 文本型
好,我们回到窗口界面,双击窗口,来到"_启动窗口_创建完毕"事件,在其下面写入如下代码:
.如果真 (我的信息框 (“调用DLL成功!要退出程序吗?”, #是否钮, “信息”) = #是钮)
结束 ()
.如果真结束
写好后,F5运行,是不是出现了一个信息框啊!点"是"后还会退出程序!
恩,搞懂了这些,理解API也就不难了! API实际上就是一些在DLL中公开的子程序,我们只要事先知道这些子程序的名子及它的参数
和它所在的DLL名称,象上面一样我们先在"DLL命令"那里声明后,就可以在易程序中像调用子程序那样调用了,我们一般查到的API资料
都是些VB声明,就像下面的GetWindowText函数:
========================================================
GetWindowText
VB声明
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch
As Long) As Long
说明
取得一个窗体的标题(caption)文字,或者一个控件的内容(在vb里使用:使用vb窗体或控件的caption或text属性)
返回值
Long,复制到lpString的字串长度;不包括空中止字符。会设置GetLastError
参数表
参数 类型及说明
hwnd Long,欲获取文字的那个窗口的句柄
lpString String,预定义的一个缓冲区,至少有cch+1个字符大小;随同窗口文字载入
cch Long,lpString缓冲区的长度
注解
不能用它从另一个应用程序的编辑控件中获取文字
=======================================================
其中较重要的就是下面这句:
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
其中Lib后面的"user32"就是易中的"DLL库文件名",Alias后面的"GetWindowTextA"就是"DLL库中对应命令名",括号里的就是它的参数
每个参数间用","号隔开,其中AS后面的就是参数类型,前面的是参数的名称(简单的描述),括号外的As后面的就是返回值类型,这里的
"Long"的中文意思就是"整数型","String"是"文本型",所以这个API在易中就是这样声明的:
.DLL命令 取得窗口标题, 整数型, "user32.dll", "GetWindowTextA"
.参数 窗口句柄, 整数型
.参数 缓冲区, 文本型
.参数 缓冲区的长度, 整数型
问: 窗口句柄我知道,可那个缓冲区和缓冲区的长度是怎么回事啊?
答: 据我自己的理解应该是这样,不知道对不对,也希望高手指教!
这个问题跟内存传递数据的方式不无关系,不知道你有没有注意到DLL命令参数那还有个"传址"的选项,我们把鼠标移上去会出现一个
提示,大意是说:如果参数的数据类型是文本,字节集,数组,用户自定以类型,库定以类型等不管是否选择此项都将直接传递地址过去而
不是数据!也就是说DLL和调用程序间不能直接传递文本型的数据,只能传递文本型的数据在内存中的地址,而窗口标题是个文本型数据
API不能直接把结果返回给我们,而是直接把结果写到我们提供的参数变量"缓冲区"的地址,在内存中的数据都是些字节型的数据,而文
本数据是以2字节的{0,0}为结束标志,API要写入或保留这个标志,先要知道这个缓冲区的长度,所以就有了个"缓冲区的长度"的参数!并
且,不只是这个API函数用这个方法,很多类似的API都是用的这个方法,像GetClassName(取窗口类名)等.
搞清楚了这样,我们就知道在易中该怎么调用了,如下面的代码:
======================================================
.子程序 API取得窗口标题, 文本型
.参数 窗口句柄, 整数型
.局部变量 缓存, 文本型
缓存 = 取空白文本 (1000) '我们要先在内存中分配足够多的空间
取得窗口标题 (窗口句柄, 缓存, 取文本长度 (缓存) ) 'API调用是写入窗口标题到缓存的地址
返回 (缓存)
=====================================================
然后
窗口名称=API取得窗口标题(窗口句柄)
恩,不知道大家明白了吗?俺是再懒得打字了,有什么不懂的,可以和我联系,俺的QQ:23453161
也可以问API高手"近在眼前",俺原来也是看他写的程序自己琢磨出来的!
END |