2007/01/09 | Vfp 调用Dll
类别(数据库学习笔记) | 评论(1) | 阅读(1477) | 发表于 10:13
注册外部 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 位浮点数 
LONG 32 位长整数 
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 名,这点在本主题的后面将要说明。

也可以用 OBJECT 作为一个返回值, 如 "DECLARE OBJECT myfunc IN some DLL ..." 虽然 COM 通常没有任何这种格式的 API。例如: 

DECLARE INTEGER AccessibleObjectFromWindow IN oleacc.dll ;
integer, integer, string , object @
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 位浮点数 
LONG 32 位长整数 
STRING 字符串 


如果参数不是共享库中的函数所希望的类型, 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 是可取的方法。

虽然 Visual FoxPro 添加了 OBJECT cFunctionType 到该命令主要用于支持一些 ActiveX Accessibility API 例程, 你可以在一般的其它 Windows API 中用它。

有关 Windows 32 位 .DLL 函数的详细内容,请参阅《Microsoft Win32 编程指南》中的文档。

执行 DISPLAY STATUS 或 LIST STATUS 可以显示注册函数的名称,执行 CLEAR ALL 或 CLEAR DLLS 可从内存中删除注册函数。

示例
这个示例为当前活动的 windows 应用程序显示句柄。当出现“等待”窗口时,可在 5 秒的时间内按下 alt + tab 键切换到不同的 windows 应用程序,否则以活动的应用程序离开 Visual FoxPro。

CLEAR
DECLARE INTEGER GetActiveWindow IN win32api
WAIT WINDOW "现在你可以切换到另一个程序了" TIMEOUT 5
? GetActiveWindow()

如在VFP中调用这个DLL:

LOCAL loCom
loCom = CREATEOBJECT(’total.Mydata’)
?loCom.GetDataCount(’temp1’) &&temp1为表名
RELEASE loCom
loCom = Null
RETURN
0

评论Comments