Database 版 (精华区)

发信人: mengy (LEAR DLLS 命令时,将从内存中清除), 信区: Database
标  题: VFP中对WIN32 API函数的调用格式
发信站: 哈工大紫丁香 (2000年12月06日20:09:03 星期三), 站内信件

VFP中对WIN32 API函数的调用格式 

 


在利用VFP编程时,经常会用到WIN32API函数来对VFP的功能进行扩展,例如对
注册表进行操作、获取系统信息等,但是由于WIN32API函数遵循的是C++的数据结
构,在应用时与VFP的数据格式有所区别,因此在调用时容易产生问题,现将有关
调用方式详解如下:
VFP中调用WIN32API的主要函数是:DECLARE - DLL 
它是注册外部 Windows 32 位动态链接库 ( .DLL ) 中的一个函数。
语法: DECLARE [cFunctionType] FunctionName IN LibraryName [AS 
AliasName] [cParamType1 [@] ParamName1, cParamType2 [@] ParamName2, ...]
 

参数:
cFunctionType 表明 32 位 Windows .DLL 函数是否有返回值。如果函数有返回值
,则包含 cFunctionType ,否则省略 cFunctionType。
cFunctionType 可以是以下值:


cFunctionType说明
SHORT16 位整数
INTEGER32 位整数
SINGLE 32 位浮点数
DOUBLE 64 位浮点数
STRING 字符串

FunctionName 指定在 Visual FoxPro 中要注册的 32 位 Windows .DLL 函数名。
注意 FunctionName 区分大小写。 32 位 Windows .DLL 函数名可以与 Win32 API
 手册中规定的不同。例如,Messagebox 函数应该命名为 MessogeBoxA(对于单字
节字符)和 MessageBoxW(对于 UNICODE)。如果 Visual FoxPro 不能定位 
FunctionName 指定的 32 位 Windows .DLL 函数,则将字母 A 追加到函数名尾部
,Visual FoxPro 用新的函数名重新搜索。
如果指定的 32 位 Windows .DLL 函数与一个 Visual FoxPro 函数同名,或者函
数名不是合法的 Visual FoxPro 函数名,则将 32 位 Windows .DLL 函数名作为
 FunctionName,并用 AS 子句给该函数取一个合法的 Visual FoxPro 名,这点在
本主题的后面将要说明。

IN LibraryName 指定外部 Windows .DLL 的名称,该动态链接库包含 
FunctionName 指定的 Windows 32 位 .DLL 函数。如果为 LibraryName 指定 
WIN32API,则 Visual FoxPro 就在 KERNEL32.DLL、GDI32.DLL、 USER32.DLL、
MPR.DLL 和 ADVAPI32.DLL 中搜索 32 位 Windows .DLL 函数。


AS AliasName 为一个与 Visual FoxPro 函数同名或不合法的 Windows 32 位 .
DLL 函数名指定别名。AliasName 不能是 Visual FoxPro 的保留字或已经由 
Visual FoxPro 注册的 Windows 32 位 .DLL 函数名。可使用 AliasName 去调用
 Windows 32 位 .DLL 函数。AliasName 不区分大小写。


cParameterType1 [@] ParamName1, cParameterType2 [@] ParamName2, ... 指定
传递给 Windows 32 位 .DLL 函数的参数类型。
Windows 32 位 .DLL 函数由 cParameterType 指定需要的参数类型。
cParameterType 可以为下列某一类型:


cParameterType说明
INTEGER32 位整数
SINGLE    32 位浮点数
DOUBLE    64 位浮点数
STRING    字符串

如果参数不是 Windows 32 位 .DLL 函数所需要类型,Visual FoxPro 产生一个错
误。Null 值可以作为字符串传递。
调用函数时,若按引用传递一个参数,必须在这条命令的参数 cParameterType 后
面、在调用函数相应变量前面包含 @。如果在 DECLARE 中或在调用函数中没有包
含 @,参数就按值传递。有关需要按引用传递参数的 .DLL 函数的详细内容,请
参阅《Microsoft Win32 编程指南》。

附注
参数名 ParamName1,ParamName2 等是可选的,Visual FoxPro 或 Windows 32 位
 .DLL 函数并不使用它们,它们可以作为函数接收的参数名和参数类型的提示。


说明 在从 Visual FoxPro 调用一个 32 位 Windows .DLL 函数前,必须发出带有
函数名、包含该函数的 Windows .DLL 名以及函数将要接收的参数类型的 DECLARE
 命令。
为了提供向后兼容性,Visual FoxPro 仍支持 FOXTOOLS.FLL(包含在 FoxPro 早
期版本中),并允许调用 16 位 .DLL 函数的 Visual FoxPro API 库。在 Visual
 FoxPro 中,调用 .DLL 函数时使用 DECLARE 是可取的方法。
有关 Windows 32 位 .DLL 函数的详细内容,请参阅《Microsoft Win32 编程指南
》中的文档。
执行 DISPLAY STATUS 或 LIST STATUS 可以显示注册函数的名称,执行 CLEAR 
ALL 或 CLEAR DLLS 可从内存中删除注册函数。


实际应用中的几点体会:


1、在API函数的参数中表明是“//address of”的,相当于在C++的指针地址,在
注册时,一定要参数 类型后、在调用函数相应变量前面包含 @,以表明是按引用
传递一个参数。


2、对于API函数的参数中类型为LPCTSTR和LPTSTR的函数,在注册时要定义为
String类型,其他类型一般均可定义为Integer类型。


3、对于API函数的参数为一个“结构”的话,可定义为一足够大的空格字符串变量
,在通过加@按引用来传递这一参数。




--

       大海无边天做岸
               山登绝顶我为风

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.884毫秒