VFP帮助中的FLL资料_第1页
VFP帮助中的FLL资料_第2页
VFP帮助中的FLL资料_第3页
VFP帮助中的FLL资料_第4页
VFP帮助中的FLL资料_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、将参数传递到 Visual FoxPro API 函数1二、如何从 ActiveX 控件和 FLL 库返回值2三、外部库的参数4四、创建 Visual FoxPro 动态链接库8五、访问 Visual FoxPro 的变量和字段10六、用 Visual FoxPro API 管理内存11七、如何管理内存12八、FoxInfo 结构13一、将参数传递到 Visual FoxPro API 函数Visual FoxPro API 例程常常需要特定 Visual FoxPro 数据结构的参数。下列部分提供了 Visual FoxPro 数据类型和附加数据结构的列表。有关实际的类型定义和结构定义,

2、参考 Pro_ext.h 文件。Visual FoxPro API 数据类型下列数据类型可用于 Visual FoxPro API 例程。数据类型说明EDLINE编辑窗口中打开文件中的行号。第一行是 1。EDPOS编辑窗口中打开文件中字符的偏移位置。该文件或备注文件中第一个字符的偏移位置是 0。FCHAN文件通道。每个由 Visual FoxPro 或使用 _FCreate( ) 和 _FOpen( ) 通过 API 打开的文件都被指派一个 FCHAN。FPFI指向返回整数值函数的 32 位指针。ITEMID指派给菜单上单个命令的唯一标识符。MENUID指派给菜单的唯一标识符。MHANDLE给

3、予每个由 Visual FoxPro 或使用 _AllocHand( ) 通过 API 分配的内存块的唯一标识符。可以使用 _HandToPtr( ) 放弃对指针的引用。 NTI命名表索引。每个变量和表字段名都拥有该表中的一项。WHANDLE窗口句柄。指派给由 Visual FoxPro 或使用 _WOpen( ) 通过 API 打开窗口的唯一标识符。 注意:由于 FAR 指针不适合于 32 位编译器,Pro_ext.h 中的 #define 语句将 FAR、_far 和 _far 重新定义为 null 值。Visual FoxPro API 数据结构下表列示了 Visual FoxPro A

4、PI 库中使用的主要数据结构。结构说明EventRec用于描述给定时间上系统正在进行什么操作的结构。FoxInfo用于 FLL 库中 Visual FoxPro 和程序间的通讯,不能用于 .ocx 文件。FoxTable用于 FLL 库中 Visual FoxPro 和程序间的通讯,不能用于 .ocx 文件。Locator用于访问参数值(FLL)或 Visual FoxPro 变量或字段(FLL 和 ocx)的结构。ParamBlk用于 FLL 库中 Visual FoxPro 和程序间的通讯,不能用于 .ocx 文件。Parameter用于 FLL 库中 Visual FoxPro 和程序间

5、的通讯,不能用于 .ocx 文件。Point定义屏幕上单个点的水平和垂直坐标的结构。以行和列指定坐标。Rect定义屏幕上矩形坐标的结构。矩形的左上角坐标由(top,left)定义,而右下角由 (bottom-1,right-1)定义。以行和列指定坐标。Value用于访问参数值(FLL)或 Visual FoxPro 变量或字段 (FLL 和 OCX)的结构。二、如何从 ActiveX 控件和 FLL 库返回值可以将值从 ActiveX 控件或 Visual FoxPro 动态连接库(FLL) 中返回到 Visual FoxPro。要将值从 ActiveX 控件返回到 Visual FoxPro

6、在该控件中使用 RETURN 语句并传递单个值。下列示例使用 RETURN 语句返回存储在 VERSION 中的版本号:复制代码#define VERSION 101/ 此处是其他代码long CPyCtrl:GetVersion() / 在变量 fVersion 中设置版本号 return VERSION;从 FLL 库中返回值当要从 FLL 库中返回值时,请使用 API 函数,而不是 C 或 C+ 本身的命令。注意:当从 ActiveX 控件 (.ocx) 文件中返回值时,不要使用 API 函数从该 FLL 库中返回值,而使用 RETURN 语句。要从 FLL 库中返回值使用下表所列示的

7、API 函数。下列 API 函数只能用于 FLL 库。函数说明_RetChar(char *string)设置函数返回值为 NULL 结尾的串。_RetCurrency(CCY cval, int width)设置函数返回值为货币值。_RetDateStr(char *string)设置函数返回值为日期。该日期以 mm/dd/yyyy 格式指定。_RetDateTimeStr(char *string)设置函数返回值为以 mm/dd/yyyy hh:mm:ss 格式指定的日期和时间。_RetFloat(double flt, int width, int dec)设置函数返回值为为浮点值。_R

8、etInt(long ival, int width)设置函数返回值为数字值。_RetLogical(int flag)设置函数返回值为逻辑值。零被当作假(FALSE)。任何非零值都被当作真(TRUE)。_RetVal(Value *val)传递完整的 Visual FoxPro Value 结构,可以返回除备注型以外的任何 Visual FoxPro 数据类型。必须调用 _RetVal( ) 来返回包含内置 null 字符的串或 .NULL. 值。注意:要返回对象数据类型的值,请使用 _RetVal() 函数填充 Value 结构的 ev_object 字段。下面示例,Sum 接收了对表中数

9、值型字段的引用并使用 _RetFloat 返回了该字段值的和:复制代码#include Sum(ParamBlk *parm)/ 声明变量double tot = 0, rec_cnt;int i = 0, workarea = -1; / -1 是当前工作区Value val;/ GO TOP 到表头_DBRewind(workarea);/ Get RECCOUNT( ) 获取记录数rec_cnt = _DBRecCount(workarea);/ 循环遍历表for(i = 0; i p0.loc, &val); / 将该值添加到累计总数 tot += val.ev_real; / SKI

10、P 1 在工作区中下跳一条记录 _DBSkip(workarea, 1); / 将总数值返回到 Visual FoxPro_RetFloat(tot, 10, 4); / Sum 函数获得一个引用参数FoxInfo myFoxInfo = SUM, Sum, 1,R ;FoxTable _FoxTable = (FoxTable *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo;假设当前打开的表中有名为 amount 的数值型字段,Visual FoxPro 程序中的下列代码行可以调用该函数:复制代码? SUM(amount)三、外部库的参数

11、当 Visual FoxPro 调用 ActiveX 控件、COM 对象或 Visual FoxPro 动态连接库(FLL)时,可以传递参数。例如,ActiveX 控件可能在调用它其中一个方法时接收参数。同样,Visual FoxPro 程序也可能调用 FLL 库中的函数并将参数传递给它。Visual FoxPro 可以通过值或通过引用将参数传递给外部库。在默认情况下,遵循 SET UDFPARMS 命令的设置。然而,其他变量,如数组或字段,以及表达式通过值来传递。有关如何改变传递参数默认方法的信息,请参见 将数据传递给参数。 由于 ActiveX 控件和 COM 对象是标准的 Windows

12、 程序,不需要特别的机制将参数从 Visual FoxPro 传递到 ActiveX 控件或 COM 对象。可以象从任何 C 或 C+ 程序接收参数那样编写库代码。然而,FLL 库中的函数使用 FoxInfo 结构从 Visual FoxPro 中获取数据。FoxInfo 结构列示了库函数以及它们所期待的参数数量和类型。例如,下列 FoxInfo 结构属于带有一个内部被称为 dates ,接收一个字符型参数的函数的库:复制代码FoxInfo myFoxInfo = DATES, (FPFI) dates, 1, C ;在外部库中定义的函数实际上只接收了一个参数,也就是到参数块的指针。该参数块,

13、在 ParamBlk 结构中定义,存储了所有有关从 Visual FoxPro 函数调用传递来的参数信息。下面的代码举例说明了函数声明应当遵循的格式:复制代码void function_name(ParamBlk *parm)例如,dates 的函数定义是:复制代码void dates(ParamBlk *parm)ParamBlk 结构由表示参数数量的整数组成,后面直接跟随参数联合的数组。该结构定义被包含在 Pro_ext.h 中:复制代码/* 库函数的参数列表。 */typedef struct short int pCount; /* 传递的参数数量 */ Parameter p1; /

14、* pCount 参数 */ ParamBlk;包含在 ParamBlk 结构中的 Parameter typedef 是 Value 结构和 Locator 结构的组合。通过值的调用由 Value 结构处理;通过引用的调用由 Locator 结构处理。当从 Visual FoxPro 中调用函数时,可以使用这些结构接收传递到函数的参数。下列从 Pro_ext.h 文件中提取出来的信息展示了 Parameter 类型的定义:复制代码/* 到库函数的参数。 */typedef union Value val; Locator loc; Parameter;Value 结构定义如果通过值将参数传递

15、到函数,则使用 Value 结构来接收它。下面的 Value 结构定义是从 Pro_ext.h 文件中提取出来的:复制代码/ An expressions value.Typedef struct char ev_type; char ev_padding; short ev_width; unsigned ev_length; long ev_long; double ev_real; CCY ev_currency; MHANDLE ev_handle; ULONG ev_object; Value;Value 结构域下表是对于不同数据类型,可以在 Value 结构中传递和接收值的指导。只

16、有为数据类型列示的结构域才可以用于该数据类型。不同数据类型的 Value 结构内容数据类型结构域值字符型ev_typeCev_length串长度ev_handle到串的 MHANDLE数值型ev_typeNev_width显示宽度ev_length小数位ev_real双精度整型(Integer)ev_typeIev_width显示宽度ev_long长整型(Long integer)日期型ev_typeDev_real日期1日期时间(Date Time)ev_typeTev_real日期 + (秒/86400.0)货币型ev_typeYev_width显示宽度ev_currency货币值2逻辑型

17、ev_typeLev_length0 或 1备注型ev_typeMev_wdithFCHANev_long备注字段长度ev_real备注字段偏移量通用(General)ev_typeGev_wdithFCHANev_long通用型字段长度ev_real通用型字段偏移量对象(Object)ev_typeOev_object对象标识符Nullev_type0 (零)ev_long数据类型1. 日期被表现为使用 ACM 算法集合中 199 算法(Algorithm 199 from Collected Algorithms of the ACM)计算出来的双精度浮点儒略(Julian)日数字。 2.

18、 货币值是长整型,在最后四个阿拉伯数字之前带有隐含的小数点。注意:ev_length 是串长度的唯一真实的指示器。由于串可以包含内置的 null 字符,因此串不能以 null 作为终止符。Locator 结构定义使用 Locator 结构操作通过引用传递的参数。下面的 Locator 结构定义是从 Pro_ext.h 文件提取的:复制代码typedef struct char l_type; short l_where, /* 数据库编号或内存变量的 -1 */ l_NTI, /* 变量名表的偏移量 */ l_offset, /* 数据库中的索引 */ l_subs, /* # 指定的下标 0

19、 = x = 2 */ l_sub1, l_sub2; /* 下标整型值 */ Locator;Locator 结构域下表是 Locator 结构中域的指导。Locator 域域的用途l_typeRl_where包含该域的表编号,或变量的 1。l_NTI名称表索引。Visual FoxPro 内部使用。l_offset表中的域编号。Visual FoxPro 内部使用。l_subs只用于变量,下标的编号(0 2)。l_sub1只用于变量,如果 l_subs 不是 0,则为第一个下标。l_sub2只用于变量,如果 l_subs 是 2,则为第二个下标。注意:检查 ev_type 中的参数类型以帮

20、助确定从 Value structure 接收的是哪几个域是良好的设计习惯。访问 FLL 库中参数示例下面示例使用 _StrCpy( ) 将字符型类型返回给 Visual FoxPro,那是其两个字符型参数的串联。注意,尽管每个参数 Value 结构的句柄被用于操作内存以完成该串联,但改变内存的分配不影响通过值传递的 Visual FoxPro 参数。复制代码#include Example(ParamBlk *parm)/ 通过使用 #define 快捷方式使得 paramBlk 结构易于管理#define p0 (parm-p0.val)#define p1 (parm-p1.val)/

21、确保有足够的内存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 *)_Ha

22、ndToPtr(p0.ev_handle) + p0.ev_length,_HandToPtr(p1.ev_handle);/ 将已连接的串返回给 Visual FoxPro_RetChar(_HandToPtr(p0.ev_handle);/ 解除句柄锁定_HUnLock(p0.ev_handle);_HUnLock(p1.ev_handle);FoxInfo myFoxInfo = STRCAT, Example, 2, CC,;FoxTable _FoxTable = (FoxTable *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo

23、;四、创建 Visual FoxPro 动态链接库Visual FoxPro 动态链接库本质上是一个包含调用 Visual FoxPro API 的 DLL。在开发环境中,当你想添加调用的 Visual FoxPro 函数时,你可以创建基本的 DLL 结构。下列章节讲述了在 C 和 C+ 中创建 FLL 模板的模板示例。设立库模板每个 Visual FoxPro FLL 库有相同的基本结构。你可以使用一个关于结构的模板,所以仅需添加关于特殊库例程的代码。在一个 Visual FoxPro 库模板中有五个要素:#include 语句。函数定义。该函数定义有一个空的返回值和传递 ParamBlk

24、*parm 的参数。有关更多的关于ParamBlk 参数的信息请参见在外部库中的参数。函数代码。FoxInfo 结构。在 FLL 中的函数通过 FoxInfo 结构与 Visual FoxPro 结合。Visual FoxPro 使用 FoxInfo 确定该函数名和数字及参数的类型。FoxTable 结构。FoxTable 结构是一个明了 FoxInfo 结构的连接列表。有关 FoxInfo 和 FoxTable 结构定义的更多信息,请参见 Pro_ext.h 文件。还需要下列文件:Pro_ext.h 头文件。你可以打印该文件来查看函数的声明、typedefs 和在 Visual FoxPro

25、 API 中使用的结构。Winapims.lib 文件这两个文件可在 Microsoft Visual FoxPro .SamplesAPI 目录中找到。模板示例对于 C 例程,可以使用下列模板:复制代码#include void Internal_Name(ParamBlk *parm)/ Function code goes here.FoxInfo myFoxInfo = FUNC_NAME, (FPFI) Internal_Name, 0, ,;FoxTable _FoxTable = (FoxTable *)0, sizeof(myFoxInfo)/sizeof(FoxInfo),

26、myFoxInfo;对于 C+ 例程,在下列模板中需要声明 FoxTable 作为外部结构:复制代码#include void Internal_Name(ParamBlk *parm)/ Function code goes here. FoxInfo myFoxInfo = FUNC_NAME, (FPFI) Internal_Name, 0, , ;extern C FoxTable _FoxTable = (FoxTable *)0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo ;五、访问 Visual FoxPro 的变量和字段可以在 A

27、ctiveX 控件或 FLL 函数中访问 Visual FoxPro 的变量和字段值,读取它们或设置它们。此外,还可以创建能从 Visual FoxPro 中访问的新变量。变量和字段可在 Visual FoxPro 中的命名表中得到,那是包含所有当前已定义变量和字段名的数组。可以使用命名表索引(NTI)访问数组中的单个元素。一个特定的 API 函数 _NameTableIndex( ) 依据所提供的名称返回现有变量或字段的索引。确定了给定变量的 NTI 之后,可以使用 _Load( ) API 函数读取它或使用 _Store( ) API 函数设置它。要创建新变量,可以调用 API 函数 _N

28、ewVar( )。 要访问 Visual FoxPro 的变量和字段,可以使用 Pro_ext.h 中定义的 Value 和 Locator 结构。如果正在创建 FLL 库,可以使用被用于访问传递到函数参数的同样技术。有关 Value 和 Locator 结构的详细资料,请参见 外部库的参数。 下面示例举例说明了如何可以使用 Value 和 Locator 结构在 ActiveX 控件中访问 Visual FoxPro 变量。复制代码long CFoxtlibCtrl:TLGetTypeAttr(long pTypeInfo, LPCTSTR szArrName) int nResult =

29、1; TYPEATTR *lpTypeAttr; Locator loc; Value val; OLECHAR szGuid128; char *szBuff;_try if (_FindVar(_NameTableIndex( char *)szArrName),-1,&loc) (ITypeInfo *)pTypeInfo)-GetTypeAttr(&lpTypeAttr); if (_ALen(loc.l_NTI, AL_ELEMENTS) guid, (LPOLESTR )&szGuid,sizeof(szGuid); OLEOleToAnsiString(szGuid,&szBuf

30、f); val.ev_type = C; val.ev_length = strlen(szBuff); val.ev_handle = _AllocHand(val.ev_length); _HLock(val.ev_handle); _MemMove(char *) _HandToPtr( val.ev_handle ), szBuff, val.ev_length); OLEFreeString(void *)&szBuff); _HUnLock(val.ev_handle); loc.l_sub1 = 1; _Store(&loc,&val); _FreeHand(val.ev_han

31、dle); /2 = LCID loc.l_sub1 = 2; val.ev_type = I; val.ev_long = lpTypeAttr-lcid; _Store(&loc,&val); / code for values 3 - 16 here (ITypeInfo *)pTypeInfo) - ReleaseTypeAttr(lpTypeAttr); _except (EXCEPTION_EXECUTE_HANDLER) nResult = 0; return nResult;六、用 Visual FoxPro API 管理内存Visual FoxPro API 提供了对 Vis

32、ual FoxPro 动态内存管理器的直接访问。请求内存分配的 API 例程返回识别内存的内存句柄。Visual FoxPro 使用句柄而不是指针分段加载结构,以便可以更有效地管理内存。内存句柄实际上是指针数组中的索引。该指针指向 Visual FoxPro 掌握的内存块。API 中几乎所有对内存的引用都是通过几柄而不是更传统的 C 指针来实现。理解堆栈所创建的控件或库并不具有自己的内存堆栈。相反,它使用调用程序的内存堆栈,或这里的 Visual FoxPro 堆栈。然而,无法控制 Visual FoxPro 堆栈的大小或影响 ActiveX 控件或 FLL 可用堆栈空间的总数。在正常情况下,

33、这个差别并不重要。Visual FoxPro 堆栈通常大到足以支撑可能要在控件或库中指派的自动变量。如果用完了堆栈空间,始终可以动态地在堆栈上指派额外的内存。使用句柄的规则下列规则适用于内存句柄的指派和释放:用户必须释放他们指派的所有句柄,包括通过 _Load() 之类函数指派的句柄。_Load() 只在所加载的变量是字符串(即,ev_type = C)时才创建句柄。所有其他数据类型在它自己的 Value 结构中存储其值,而字符串的加载将 MHANDLE 放置到 Value 结构的 ev_handle 中。在 FLL 库中,Visual FoxPro 负责释放所有用 _RetVal( ) 返回

34、的句柄。即使用户指派了它们,也不能释放这些句柄。用户不能释放 ParamBlk 中传递的句柄。警告:当编写调用函数的外部例程序时,确定遵从了所有规则并检查了返回结果。迷失的指针和句柄引用可以损害 Visual FoxPro 内部数据结构,导致直接的异常终止或遗留的问题,可以导致数据丢失。七、如何管理内存可以使用 Visual FoxPro API 分配和管理内存。注意:所描述的技术适用于 ActiveX 控件和 FLL 库。要分配和使用内存用 _AllocHand( ) 分配句柄。 用 _HLock( ) 锁定句柄。 用 _HandToPtr( ) 将句柄转换为指针。 通过使用指针来引用内存。

35、用 _HUnLock( ) 解锁句柄。 注意:要避免损坏备注文件,在调用 _AllocMemo( ) 之前不要写备注文件。为了确定已分配内存的地址,API 例程必须调用 _HandToPtr( ) 例程将句柄转换为指针。即使 Visual FoxPro 内存管理器需要重新组织内存以便为后来的内存请求获取更加连续的内存,该句柄也保持不变。同时还提供了增加、减少、释放和锁定内存分配的例程。在创建外部例程时,应尽量减少内存的使用。如果创建了动态分配内存的外部例程,尽可能少地使用内存。对于长时间锁定大量内存分配时要特别小心。记住在不再需要锁定时用 _HUnLock( ) 解锁内存句柄,因为锁定内存句柄

36、会对 Visual FoxPro 的性能产生不利影响。警告:过多地使用动态内存会侵占 Visual FoxPro 缓冲、窗口、菜单等的内存,并导致性能降低,因为满足 API 需求的内存是由 Visual FoxPro 内存管理器进行管理的。分配大量句柄并保留它们可以导致 Visual FoxPro 用完内存并异常终止。Visual FoxPro 环境不具备内存保护。外部 API 例程不能完全提供标准 Visual FoxPro 程序中固有的检验。如果破坏了内存,将会接受到“跨越句柄(Transgressed handle)”、“内部一致性错误(Internal consistency erro

37、r)” 和 “压缩过程中跨越节点(Transgressed node during compaction)” 之类的信息。下面 FLL 库中的函数举例说明了内存的分配。该示例使用 _RetDateStr( ) 返回了一个 Visual FoxPro 日期型 类型(假定 Character 参数是正确的日期):复制代码#include void dates(ParamBlk *parm) MHANDLE mh; char *instring; if (mh = _AllocHand(parm-p0.val.ev_length + 1) = 0) _Error(182); / 内存不足 _HLock(parm-p0.val.ev_handle); instring = _HandToPtr(parm-p0.val.ev_handle); instringparm-p0.val.ev_length = 0; _RetDateStr(instring); _HUnLock(parm-p0.val.ev_handle);FoxInfo myFoxInfo = DATES, (FPFI) dates, 1, C;FoxTable _FoxTable = (FoxTable *)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论