好文档 - 专业文书写作范文服务资料分享网站

vfp中api函数调用实例

天下 分享 时间: 加入收藏 我要投稿 点赞

vfp中api函数调用实例

我们在vfp编程时,为了弥补vfp本身功能的不足,常常会用到win32api函数来对vfp 的功能进行扩展,例如取得系统信息、对注册表进行操作等,但由于win32api函数是c++ 的数据结构形式,在调用时与vfp的数据格式有所不同,因此在调用时往往会产生问题。下 面,笔者就在vfp如何调用win32api函数,并就一些常用的win32api函数调用实例作一具 体介绍。

一、vfp中调用win32api函数的格式

vfp中调用win32api函数的命令主要是declare-dll和clear dlls两个。

1. declare-dll 它用于注册外部windows 32位动态链接库(.dll)中的一个函数。

语法:

declare [cfunctiontype] functionname in libraryname [as aliasname] [cparamtype1 [@] paramname1, cparamtype2 [@] paramname2, ...] 说明:

cfunctiontype 指定该函数返回值的类型,其类型代码如下: short 16位整数 integer 32位整数 single 32位浮点数 double 64位浮点数 string 字符串

functionname指定在要注册使用的32位函数名。注意functionname区分大小 写。

如果该函数名与visual foxpro的保留字相同,应使用as参数另起别名。

in libraryname 指定该函数所在的外部动态链接库文件名,如果libraryname为 win32api时,vfp将依次查找:kernel32.dll、gdi32.dll、user32.dll、mpr.dll及advapi32.dll 等动态链接库文件名。

as aliasname 为当api函数的名称与visual foxpro的保留字相同时,另取 aliasname别名,另取的别名是不区分大小写的。

cparametertype1 [@] paramname1, cparametertype2 [@] paramname2, ...

指定传递给被调用的32位.dll函数的参数类型及参数名称。其类型代码如 cfunctiontype,如果要以传址方法传递参数则应在参数名前加上@。 2. clear dlls 释放所有利用declare-dll命令所装入的动态链接库。

一旦申明win32api函数成功,就可以和一般函数一样用?xxx()、=xxx() 来使用。

二、vfp中常用win32api函数调用实例

1.利用win32api函数获取指定磁盘的卷标:

stor 0 to c—var,c—cd,c—qf c—disk=′c:\\′ &&指定磁盘

declare integer getvolumeinformation in win32api string @,string @,integer,; integer @, integer @, integer @, string @, integer

xx=getvolumeinformation(c—disk,″ ″,20,@c—var,@c—cd,@c—qf,0,0) clear dlls 返回值:

xx〈〉0 获取指定磁盘的卷标成功,反之则未成功。

c—var=指定磁盘的卷标,是个十进制的数值,与我们在dos下看到的16进制不同。 c—cd=系统规定的文件名每一部分的长度。 c—qf=文件名的大小写标志。

2.在vfp中利用wn32api函数调用outlook express给你的程序建立发送邮件的链接。 declare integer shellexecute in shell32.dll integer hwnd,; string, string lpszfile, string, string, integer * 申明shellexecute函数,

lpszfile=′mailto:cfyns@163.net′ * 设定你需要发送的e-mail

=shellexecute(0,0,lpszfile,0,0,1) * 调用shellexecute函数

3.利用win32api函数,防止同一程序被重复执行。

利用win32api中的findwindow()函数取得窗口的handle(句柄),其返回值不等

于0,则表示该exe文件已运行。 vfp代码如下:

declare integer findwindow in win32api string,string local ctitle

ctitle=—screen.caption

if find—window(0,ctitle)〈〉0

=messagebox(″程序已运行,无需重复!″,48) Endif

注意:findwindow()函数是取得窗口的caption,如果caption在程序的运行中 已经改变,则达不到目的。

4.利用win32api函数,关闭或重新启动电脑。 declare integer exitwindowsex in user32.dll integer, integer =exitwindowsex(1,1) &&关闭系统

* =exitwindowsex(2,1) &&重新启动系统

* =exitwindowsex(0,0) &&进入登录者身份对话框

5.在vfp中利用wn32api函数获取当前所有逻辑驱动器。

利用getdrivetype、getlogicaldrivestrings函数,我们可以很快找到当前所有逻辑驱 动器的根驱动器路径。下面介绍两种用法: (1) 利用getdrivetype函数:

declare integer getdrivetype in ″kernel32″ string dgs=0

for i=65 to 90

vname=chr(i) + ″:″ lx=getdrivetype(vname) do case

case lx=2 dgs=dgs+1

wait wind ′这是个软盘′

case lx=3

dgs=dgs+1

wait wind ′这是个硬盘′ case lx=4 dgs=dgs+1

wait wind ′这是个可移去式驱动器或网络驱动器′ case lx=5 dgs=dgs+1

wait wind ′这是个光盘′ case lx=6 dgs=dgs+1

wait wind ′这是个ram盘′ endc endf

wait wind ′本机共有:′+str(dgs)+′个驱动器′ (2)利用getlogicaldrivestrings函数:

declare integer getlogicaldrivestrings in ″kernel32″ long, string @cc cc=spac(81)

=getlogicaldrivestrings(81,@cc)

* cc中返回了这样的字符串″a:\\ c:\\ d:\\ e:\\ f:\\ ″每个名字都用一个null字符分隔, 在最后一个名字后面用两个null表示中止。

x=(len(allt(cc))-1)/4

&&x中包含本机逻辑驱动器个数

* 如果你想知道每个具体的驱动器名,则写如下代码: dime dve(x)

for i=1 to x

dve(i)=subs(cc,1,3) cc=subs(cc,5) endf

* 这样在dve这个数组里就是每个驱动器的盘符及″:\\″ 了。

* 如果你还想知道每个驱动器的类型,则再添加和改写如下代码:

declare integer getdrivetype in ″kernel32″ string dime dve(x,2) for i=1 to x

dve(i,1)=subs(cc,1,3) lx=getdrivetype(dve(i,1)) do case case lx=2

dve(i,2)=′软盘′ case lx=3

dve(i,2)=′硬盘′ case lx=4

dve(i,2)=′可移去式驱动器或网络驱动器′ case lx=5

dve(i,2)=′光盘′ case lx=6

dve(i,2)=′ram盘′ endc

cc=subs(cc,5) endf

win32api功能调用的函数还很多,比如像操作注册表、mci(media control interface)媒体控制接口等,有的是因为这方面介绍的资料较多,有的是调 用过于烦琐,所以笔者就不准备继续介绍下去。 文中所有实例,都在中文windows 98、microsoft visual foxpro 6.0下测试通过。

vfp中api函数调用实例

vfp中api函数调用实例我们在vfp编程时,为了弥补vfp本身功能的不足,常常会用到win32api函数来对vfp的功能进行扩展,例如取得系统信息、对注册表进行操作等,但由于win32api函数是c++的数据结构形式,在调用时与vfp的数据格式有所不同,因此在调用时往往会产生问题。下面,笔者就在vfp如何调用win32api函数,并就一些常用的win3
推荐度:
点击下载文档文档为doc格式
19lr86vz6z0wk4t3w2j4
领取福利

微信扫码领取福利

微信扫码分享