VFP帮助中的FLL资料.docx
- 文档编号:23622445
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:24
- 大小:29.01KB
VFP帮助中的FLL资料.docx
《VFP帮助中的FLL资料.docx》由会员分享,可在线阅读,更多相关《VFP帮助中的FLL资料.docx(24页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VFP 帮助 中的 FLL 资料