VFP帮助中的FLL资料.docx

上传人:b****7 文档编号:23622445 上传时间:2023-05-19 格式:DOCX 页数:24 大小:29.01KB
下载 相关 举报
VFP帮助中的FLL资料.docx_第1页
第1页 / 共24页
VFP帮助中的FLL资料.docx_第2页
第2页 / 共24页
VFP帮助中的FLL资料.docx_第3页
第3页 / 共24页
VFP帮助中的FLL资料.docx_第4页
第4页 / 共24页
VFP帮助中的FLL资料.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

VFP帮助中的FLL资料.docx

《VFP帮助中的FLL资料.docx》由会员分享,可在线阅读,更多相关《VFP帮助中的FLL资料.docx(24页珍藏版)》请在冰豆网上搜索。

VFP帮助中的FLL资料.docx

VFP帮助中的FLL资料

一、将参数传递到VisualFoxProAPI函数

VisualFoxProAPI例程常常需要特定VisualFoxPro数据结构的参数。

下列部分提供了VisualFoxPro数据类型和附加数据结构的列表。

有关实际的类型定义和结构定义,参考Pro_ext.h文件。

VisualFoxProAPI数据类型

下列数据类型可用于VisualFoxProAPI例程。

数据类型

说明

EDLINE

编辑窗口中打开文件中的行号。

第一行是1。

EDPOS

编辑窗口中打开文件中字符的偏移位置。

该文件或备注文件中第一个字符的偏移位置是0。

FCHAN

文件通道。

每个由VisualFoxPro或使用_FCreate()和_FOpen()通过API打开的文件都被指派一个FCHAN。

FPFI

指向返回整数值函数的32位指针。

ITEMID

指派给菜单上单个命令的唯一标识符。

MENUID

指派给菜单的唯一标识符。

MHANDLE

给予每个由VisualFoxPro或使用_AllocHand()通过API分配的内存块的唯一标识符。

可以使用_HandToPtr()放弃对指针的引用。

NTI

命名表索引。

每个变量和表字段名都拥有该表中的一项。

WHANDLE

窗口句柄。

指派给由VisualFoxPro或使用_WOpen()通过API打开窗口的唯一标识符。

注意:

由于FAR指针不适合于32位编译器,Pro_ext.h中的#define语句将FAR、_far和__far重新定义为null值。

 

VisualFoxProAPI数据结构

下表列示了VisualFoxProAPI库中使用的主要数据结构。

结构

说明

EventRec

用于描述给定时间上系统正在进行什么操作的结构。

FoxInfo

用于FLL库中VisualFoxPro和程序间的通讯,不能用于.ocx文件。

FoxTable

用于FLL库中VisualFoxPro和程序间的通讯,不能用于.ocx文件。

Locator

用于访问参数值(FLL)或VisualFoxPro变量或字段(FLL和ocx)的结构。

ParamBlk

用于FLL库中VisualFoxPro和程序间的通讯,不能用于.ocx文件。

Parameter

用于FLL库中VisualFoxPro和程序间的通讯,不能用于.ocx文件。

Point

定义屏幕上单个点的水平和垂直坐标的结构。

以行和列指定坐标。

Rect

定义屏幕上矩形坐标的结构。

矩形的左上角坐标由(top,left)定义,而右下角由(bottom-1,right-1)定义。

以行和列指定坐标。

Value

用于访问参数值(FLL)或VisualFoxPro变量或字段(FLL和OCX)的结构。

二、如何从ActiveX控件和FLL库返回值

可以将值从ActiveX控件或VisualFoxPro动态连接库(FLL)中返回到VisualFoxPro。

要将值从ActiveX控件返回到VisualFoxPro

在该控件中使用RETURN语句并传递单个值。

下列示例使用RETURN语句返回存储在VERSION中的版本号:

复制代码

#defineVERSION101

//此处是其他代码

longCPyCtrl:

:

GetVersion()

{

//在变量fVersion中设置版本号

returnVERSION;

}

从FLL库中返回值

当要从FLL库中返回值时,请使用API函数,而不是C或C++本身的命令。

注意:

当从ActiveX控件(.ocx)文件中返回值时,不要使用API函数从该FLL库中返回值,而使用RETURN语句。

 

要从FLL库中返回值

使用下表所列示的API函数。

下列API函数只能用于FLL库。

函数

说明

_RetChar(char*string)

设置函数返回值为NULL结尾的串。

_RetCurrency(CCYcval,intwidth)

设置函数返回值为货币值。

_RetDateStr(char*string)

设置函数返回值为日期。

该日期以mm/dd/yy[yy]格式指定。

_RetDateTimeStr(char*string)

设置函数返回值为以mm/dd/yy[yy]hh:

mm:

ss格式指定的日期和时间。

_RetFloat(doubleflt,intwidth,intdec)

设置函数返回值为为浮点值。

_RetInt(longival,intwidth)

设置函数返回值为数字值。

_RetLogical(intflag)

设置函数返回值为逻辑值。

零被当作假(FALSE)。

任何非零值都被当作真(TRUE)。

_RetVal(Value*val)

传递完整的VisualFoxProValue结构,可以返回除备注型以外的任何VisualFoxPro数据类型。

必须调用_RetVal()来返回包含内置null字符的串或.NULL.值。

注意:

要返回对象数据类型的值,请使用_RetVal()函数填充Value结构的ev_object字段。

 

下面示例,Sum接收了对表中数值型字段的引用并使用_RetFloat返回了该字段值的和:

复制代码

#include

Sum(ParamBlk*parm)

{

//声明变量

doubletot=0,rec_cnt;

inti=0,workarea=-1;//-1是当前工作区

Valueval;

//GOTOP到表头

_DBRewind(workarea);

//GetRECCOUNT()获取记录数

rec_cnt=_DBRecCount(workarea);

//循环遍历表

for(i=0;i

{

//将字段值放置到Value结构中

_Load(&parm->p[0].loc,&val);

//将该值添加到累计总数

tot+=val.ev_real;

//SKIP1在工作区中下跳一条记录

_DBSkip(workarea,1);

}

//将总数值返回到VisualFoxPro

_RetFloat(tot,10,4);

}

//Sum函数获得一个引用参数

FoxInfomyFoxInfo[]={

{"SUM",Sum,1,"R"}

};

FoxTable_FoxTable={

(FoxTable*)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo

};

假设当前打开的表中有名为amount的数值型字段,VisualFoxPro程序中的下列代码行可以调用该函数:

复制代码

?

SUM(@amount)

三、外部库的参数

当VisualFoxPro调用ActiveX控件、COM对象或VisualFoxPro动态连接库(FLL)时,可以传递参数。

例如,ActiveX控件可能在调用它其中一个方法时接收参数。

同样,VisualFoxPro程序也可能调用FLL库中的函数并将参数传递给它。

VisualFoxPro可以通过值或通过引用将参数传递给外部库。

在默认情况下,遵循SETUDFPARMS命令的设置。

然而,其他变量,如数组或字段,以及表达式通过值来传递。

有关如何改变传递参数默认方法的信息,请参见将数据传递给参数。

由于ActiveX控件和COM对象是标准的Windows程序,不需要特别的机制将参数从VisualFoxPro传递到ActiveX控件或COM对象。

可以象从任何C或C++程序接收参数那样编写库代码。

然而,FLL库中的函数使用FoxInfo结构从VisualFoxPro中获取数据。

FoxInfo结构列示了库函数以及它们所期待的参数数量和类型。

例如,下列FoxInfo结构属于带有一个内部被称为dates,接收一个字符型参数的函数的库:

复制代码

FoxInfomyFoxInfo[]={

{"DATES",(FPFI)dates,1,"C"}

};

在外部库中定义的函数实际上只接收了一个参数,也就是到参数块的指针。

该参数块,在ParamBlk结构中定义,存储了所有有关从VisualFoxPro函数调用传递来的参数信息。

下面的代码举例说明了函数声明应当遵循的格式:

复制代码

voidfunction_name(ParamBlk*parm)

例如,dates的函数定义是:

复制代码

voiddates(ParamBlk*parm)

ParamBlk结构由表示参数数量的整数组成,后面直接跟随参数联合的数组。

该结构定义被包含在Pro_ext.h中:

复制代码

/*库函数的参数列表。

*/

typedefstruct{

shortintpCount;/*传递的参数数量*/

Parameterp[1];/*pCount参数*/

}ParamBlk;

包含在ParamBlk结构中的Parametertypedef是Value结构和Locator结构的组合。

通过值的调用由Value结构处理;通过引用的调用由Locator结构处理。

当从VisualFoxPro中调用函数时,可以使用这些结构接收传递到函数的参数。

下列从Pro_ext.h文件中提取出来的信息展示了Parameter类型的定义:

复制代码

/*到库函数的参数。

*/

typedefunion{

Valueval;

Locatorloc;

}Parameter;

Value结构定义

如果通过值将参数传递到函数,则使用Value结构来接收它。

下面的Value结构定义是从Pro_ext.h文件中提取出来的:

复制代码

//Anexpression'svalue.

Typedefstruct{

charev_type;

charev_padding;

shortev_width;

unsignedev_length;

longev_long;

doubleev_real;

CCYev_currency;

MHANDLEev_handle;

ULONGev_object;

}Value;

Value结构域

下表是对于不同数据类型,可以在Value结构中传递和接收值的指导。

只有为数据类型列示的结构域才可以用于该数据类型。

不同数据类型的Value结构内容

数据类型

结构域

字符型

ev_type

'C'

 

ev_length

串长度

 

ev_handle

到串的MHANDLE

数值型

ev_type

'N'

 

ev_width

显示宽度

 

ev_length

小数位

 

ev_real

双精度

整型(Integer)

ev_type

'I'

 

ev_width

显示宽度

 

ev_long

长整型(Longinteger)

日期型

ev_type

'D'

 

ev_real

日期1

日期时间(DateTime)

ev_type

'T'

 

ev_real

日期+(秒/86400.0)

货币型

ev_type

'Y'

 

ev_width

显示宽度

 

ev_currency

货币值2

逻辑型

ev_type

'L'

 

ev_length

0或1

备注型

ev_type

'M'

 

ev_wdith

FCHAN

 

ev_long

备注字段长度

 

ev_real

备注字段偏移量

通用(General)

ev_type

'G'

 

ev_wdith

FCHAN

 

ev_long

通用型字段长度

 

ev_real

通用型字段偏移量

对象(Object)

ev_type

'O'

 

ev_object

对象标识符

Null

ev_type

'0'(零)

 

ev_long

数据类型

1.日期被表现为使用ACM算法集合中199算法(Algorithm199fromCollectedAlgorithmsoftheACM)计算出来的双精度浮点儒略(Julian)日数字。

2.货币值是长整型,在最后四个阿拉伯数字之前带有隐含的小数点。

注意:

ev_length是串长度的唯一真实的指示器。

由于串可以包含内置的null字符,因此串不能以null作为终止符。

 

Locator结构定义

使用Locator结构操作通过引用传递的参数。

下面的Locator结构定义是从Pro_ext.h文件提取的:

复制代码

typedefstruct{

charl_type;

shortl_where,/*数据库编号或内存变量的-1*/

l_NTI,/*变量名表的偏移量*/

l_offset,/*数据库中的索引*/

l_subs,/*#指定的下标0<=x<=2*/

l_sub1,l_sub2;/*下标整型值*/

}Locator;

Locator结构域

下表是Locator结构中域的指导。

Locator域

域的用途

l_type

'R'

l_where

包含该域的表编号,或变量的–1。

l_NTI

名称表索引。

VisualFoxPro内部使用。

l_offset

表中的域编号。

VisualFoxPro内部使用。

l_subs

只用于变量,下标的编号(0–2)。

l_sub1

只用于变量,如果l_subs不是0,则为第一个下标。

l_sub2

只用于变量,如果l_subs是2,则为第二个下标。

注意:

检查ev_type中的参数类型以帮助确定从Valuestructure接收的是哪几个域是良好的设计习惯。

 

访问FLL库中参数示例

下面示例使用_StrCpy()将字符型类型返回给VisualFoxPro,那是其两个字符型参数的串联。

注意,尽管每个参数Value结构的句柄被用于操作内存以完成该串联,但改变内存的分配不影响通过值传递的VisualFoxPro参数。

复制代码

#include

Example(ParamBlk*parm)

{

//通过使用#define快捷方式使得paramBlk结构易于管理

#definep0(parm->p[0].val)

#definep1(parm->p[1].val)

//确保有足够的内存

if(!

_SetHandSize(p0.ev_handle,p0.ev_length+p1.ev_length))

_Error(182);//"内存不足"

//锁定句柄

_HLock(p0.ev_handle);

_HLock(p1.ev_handle);

//将句柄转换为指针并确保串是由null作终止符

((char*)_HandToPtr(p0.ev_handle))[p0.ev_length]='\0';

((char*)_HandToPtr(p1.ev_handle))[p1.ev_length]='\0';

//用API函数_StrCpy连接串

_StrCpy((char*)_HandToPtr(p0.ev_handle)+p0.ev_length,

_HandToPtr(p1.ev_handle));

//将已连接的串返回给VisualFoxPro

_RetChar(_HandToPtr(p0.ev_handle));

//解除句柄锁定

_HUnLock(p0.ev_handle);

_HUnLock(p1.ev_handle);

}

FoxInfomyFoxInfo[]={

{"STRCAT",Example,2,"CC"},

};

FoxTable_FoxTable={

(FoxTable*)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo

};

四、创建VisualFoxPro动态链接库

VisualFoxPro动态链接库本质上是一个包含调用VisualFoxProAPI的DLL。

在开发环境中,当你想添加调用的VisualFoxPro函数时,你可以创建基本的DLL结构。

下列章节讲述了在C和C++中创建FLL模板的模板示例。

设立库模板

每个VisualFoxProFLL库有相同的基本结构。

你可以使用一个关于结构的模板,所以仅需添加关于特殊库例程的代码。

在一个VisualFoxPro库模板中有五个要素:

#include语句。

函数定义。

该函数定义有一个空的返回值和传递ParamBlk*parm的参数。

有关更多的关于ParamBlk参数的信息请参见在外部库中的参数。

函数代码。

FoxInfo结构。

在FLL中的函数通过FoxInfo结构与VisualFoxPro结合。

VisualFoxPro使用FoxInfo确定该函数名和数字及参数的类型。

FoxTable结构。

FoxTable结构是一个明了FoxInfo结构的连接列表。

有关FoxInfo和FoxTable结构定义的更多信息,请参见 Pro_ext.h文件。

还需要下列文件:

Pro_ext.h头文件。

你可以打印该文件来查看函数的声明、typedefs和在VisualFoxProAPI中使用的结构。

Winapims.lib文件

这两个文件可在MicrosoftVisualFoxPro..\Samples\API目录中找到。

模板示例

对于C例程,可以使用下列模板:

 

复制代码

#include

voidInternal_Name(ParamBlk*parm)

{

//Functioncodegoeshere.

}

FoxInfomyFoxInfo[]={

{"FUNC_NAME",(FPFI)Internal_Name,0,""},

};

FoxTable_FoxTable={

(FoxTable*)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo

};

对于C++例程,在下列模板中需要声明FoxTable作为外部结构:

 

复制代码

#include

voidInternal_Name(ParamBlk*parm)

{

//Functioncodegoeshere.

}

FoxInfomyFoxInfo[]={

{"FUNC_NAME",(FPFI)Internal_Name,0,""},

};

extern"C"{

FoxTable_FoxTable={

(FoxTable*)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo

};

}

五、访问VisualFoxPro的变量和字段

可以在ActiveX控件或FLL函数中访问VisualFoxPro的变量和字段值,读取它们或设置它们。

此外,还可以创建能从VisualFoxPro中访问的新变量。

变量和字段可在VisualFoxPro中的命名表中得到,那是包含所有当前已定义变量和字段名的数组。

可以使用命名表索引(NTI)访问数组中的单个元素。

一个特定的API函数_NameTableIndex()依据所提供的名称返回现有变量或字段的索引。

确定了给定变量的NTI之后,可以使用_Load()API函数读取它或使用_Store()API函数设置它。

要创建新变量,可以调用API函数_NewVar()。

要访问VisualFoxPro的变量和字段,可以使用Pro_ext.h中定义的Value和Locator结构。

如果正在创建FLL库,可以使用被用于访问传递到函数参数的同样技术。

有关Value和Locator结构的详细资料,请参见外部库的参数。

下面示例举例说明了如何可以使用Value和Locator结构在ActiveX控件中访问VisualFoxPro变量。

复制代码

longCFoxtlibCtrl:

:

TLGetTypeAttr(longpTypeInfo,LPCTSTRszArrName)

{

intnResult=1;

TYPEATTR*lpTypeAttr;

Locatorloc;

Valueval;

OLECHARszGuid[128];

char*szBuff;

__try{

if(_FindVar(_NameTableIndex((char*)szArrName),-1,&loc)){

((ITypeInfo*)pTypeInfo)->GetTypeAttr(&lpTypeAttr);

if(_ALen(loc.l_NTI,AL_ELEMENTS)<16){

_Error(631);//Arrayargumentnotofpropersize.

}

//1=Guid

StringFromGUID2(lpTypeAttr->guid,(LPOLESTR)&szGuid,sizeof(szGuid));

OLEOleToAnsiString(szGuid,&szBuff);

val.ev_type='C';

val.ev_length=strlen(szBuff);

val.ev_handle=_AllocHand(val.e

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1