资源描述
一、将参数传递到 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 数据类型与附加数据结构得列表。有关实际得类型定义与结构定义,参考 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
给予每个由 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 API 库中使用得主要数据结构。
结构
说明
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 与程序间得通讯,不能用于 、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
在该控件中使用 RETURN 语句并传递单个值。
下列示例使用 RETURN 语句返回存储在 VERSION 中得版本号:
复制代码
#define VERSION 101
// 此处就是其她代码
long CPyCtrl::GetVersion()
{
// 在变量 fVersion 中设置版本号
return VERSION;
}
从 FLL 库中返回值
当要从 FLL 库中返回值时,请使用 API 函数,而不就是 C 或 C++ 本身得命令。
注意:
当从 ActiveX 控件 (、ocx) 文件中返回值时,不要使用 API 函数从该 FLL 库中返回值,而使用 RETURN 语句。
要从 FLL 库中返回值
使用下表所列示得 API 函数。
下列 API 函数只能用于 FLL 库。
函数
说明
_RetChar(char *string)
设置函数返回值为 NULL 结尾得串。
_RetCurrency(CCY cval, int width)
设置函数返回值为货币值。
_RetDateStr(char *string)
设置函数返回值为日期。该日期以 mm/dd/yy[yy] 格式指定。
_RetDateTimeStr(char *string)
设置函数返回值为以 mm/dd/yy[yy] hh:mm:ss 格式指定得日期与时间。
_RetFloat(double flt, int width, int dec)
设置函数返回值为为浮点值。
_RetInt(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 接收了对表中数值型字段得引用并使用 _RetFloat 返回了该字段值得与:
复制代码
#include <Pro_ext、h>
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 < rec_cnt; i++)
{
//将字段值放置到 Value 结构中
_Load(&parm->p[0]、loc, &val);
// 将该值添加到累计总数
tot += val、ev_real;
// SKIP 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)
三、外部库得参数
当 Visual FoxPro 调用 ActiveX 控件、 对象或 Visual FoxPro 动态连接库(FLL)时,可以传递参数。例如,ActiveX 控件可能在调用它其中一个方法时接收参数。同样,Visual FoxPro 程序也可能调用 FLL 库中得函数并将参数传递给它。
Visual FoxPro 可以通过值或通过引用将参数传递给外部库。在默认情况下,遵循 SET UDFPARMS 命令得设置。然而,其她变量,如数组或字段,以及表达式通过值来传递。有关如何改变传递参数默认方法得信息,请参见 将数据传递给参数。
由于 ActiveX 控件与 对象就是标准得 Windows 程序,不需要特别得机制将参数从 Visual FoxPro 传递到 ActiveX 控件或 对象。可以象从任何 C 或 C++ 程序接收参数那样编写库代码。
然而,FLL 库中得函数使用 FoxInfo 结构从 Visual FoxPro 中获取数据。FoxInfo 结构列示了库函数以及它们所期待得参数数量与类型。例如,下列 FoxInfo 结构属于带有一个内部被称为 dates ,接收一个字符型参数得函数得库:
复制代码
FoxInfo myFoxInfo[] = {
{ "DATES", (FPFI) dates, 1, "C" }
};
在外部库中定义得函数实际上只接收了一个参数,也就就是到参数块得指针。该参数块,在 ParamBlk 结构中定义,存储了所有有关从 Visual FoxPro 函数调用传递来得参数信息。下面得代码举例说明了函数声明应当遵循得格式:
复制代码
void function_name(ParamBlk *parm)
例如,dates 得函数定义就是:
复制代码
void dates(ParamBlk *parm)
ParamBlk 结构由表示参数数量得整数组成,后面直接跟随参数联合得数组。该结构定义被包含在 Pro_ext、h 中:
复制代码
/* 库函数得参数列表。 */
typedef struct {
short int pCount; /* 传递得参数数量 */
Parameter p[1]; /* pCount 参数 */
} ParamBlk;
包含在 ParamBlk 结构中得 Parameter typedef 就是 Value 结构与 Locator 结构得组合。通过值得调用由 Value 结构处理;通过引用得调用由 Locator 结构处理。当从 Visual FoxPro 中调用函数时,可以使用这些结构接收传递到函数得参数。
下列从 Pro_ext、h 文件中提取出来得信息展示了 Parameter 类型得定义:
复制代码
/* 到库函数得参数。 */
typedef union {
Value val;
Locator loc;
} Parameter;
Value 结构定义
如果通过值将参数传递到函数,则使用 Value 结构来接收它。下面得 Value 结构定义就是从 Pro_ext、h 文件中提取出来得:
复制代码
// An expression's 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 结构中传递与接收值得指导。只有为数据类型列示得结构域才可以用于该数据类型。
不同数据类型得 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
长整型(Long integer)
日期型
ev_type
'D'
ev_real
日期1
日期时间(Date Time)
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 算法(Algorithm 199 from Collected Algorithms of the ACM)计算出来得双精度浮点儒略(Julian)日数字。 2、 货币值就是长整型,在最后四个阿拉伯数字之前带有隐含得小数点。
注意:
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 <= x <= 2 */
l_sub1, l_sub2; /* 下标整型值 */
} Locator;
Locator 结构域
下表就是 Locator 结构中域得指导。
Locator 域
域得用途
l_type
'R'
l_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 中得参数类型以帮助确定从 Value structure 接收得就是哪几个域就是良好得设计习惯。
访问 FLL 库中参数示例
下面示例使用 _StrCpy( ) 将字符型类型返回给 Visual FoxPro,那就是其两个字符型参数得串联。注意,尽管每个参数 Value 结构得句柄被用于操作内存以完成该串联,但改变内存得分配不影响通过值传递得 Visual FoxPro 参数。
复制代码
#include <Pro_ext、h>
Example(ParamBlk *parm)
{
// 通过使用 #define 快捷方式使得 paramBlk 结构易于管理
#define p0 (parm->p[0]、val)
#define p1 (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));
// 将已连接得串返回给 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
};
四、创建 Visual FoxPro 动态链接库
Visual FoxPro 动态链接库本质上就是一个包含调用 Visual FoxPro API 得 DLL。在开发环境中,当您想添加调用得 Visual FoxPro 函数时,您可以创建基本得 DLL 结构。下列章节讲述了在 C 与 C++ 中创建 FLL 模板得模板示例。
设立库模板
每个 Visual FoxPro FLL 库有相同得基本结构。您可以使用一个关于结构得模板,所以仅需添加关于特殊库例程得代码。
在一个 Visual FoxPro 库模板中有五个要素:
#include 语句。
函数定义。
该函数定义有一个空得返回值与传递 ParamBlk *parm 得参数。有关更多得关于ParamBlk 参数得信息请参见在外部库中得参数。
函数代码。
FoxInfo 结构。
在 FLL 中得函数通过 FoxInfo 结构与 Visual FoxPro 结合。Visual FoxPro 使用 FoxInfo 确定该函数名与数字及参数得类型。
FoxTable 结构。
FoxTable 结构就是一个明了 FoxInfo 结构得连接列表。
有关 FoxInfo 与 FoxTable 结构定义得更多信息,请参见 Pro_ext、h 文件。
还需要下列文件:
Pro_ext、h 头文件。
您可以打印该文件来查瞧函数得声明、typedefs 与在 Visual FoxPro API 中使用得结构。
Winapims、lib 文件
这两个文件可在 Microsoft Visual FoxPro 、、\Samples\API 目录中找到。
模板示例
对于 C 例程,可以使用下列模板:
复制代码
#include <Pro_ext、h>
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), myFoxInfo
};
对于 C++ 例程,在下列模板中需要声明 FoxTable 作为外部结构:
复制代码
#include <Pro_ext、h>
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 得变量与字段
可以在 ActiveX 控件或 FLL 函数中访问 Visual FoxPro 得变量与字段值,读取它们或设置它们。此外,还可以创建能从 Visual FoxPro 中访问得新变量。
变量与字段可在 Visual FoxPro 中得命名表中得到,那就是包含所有当前已定义变量与字段名得数组。可以使用命名表索引(NTI)访问数组中得单个元素。一个特定得 API 函数 _NameTableIndex( ) 依据所提供得名称返回现有变量或字段得索引。确定了给定变量得 NTI 之后,可以使用 _Load( ) API 函数读取它或使用 _Store( ) API 函数设置它。要创建新变量,可以调用 API 函数 _NewVar( )。
要访问 Visual FoxPro 得变量与字段,可以使用 Pro_ext、h 中定义得 Value 与 Locator 结构。如果正在创建 FLL 库,可以使用被用于访问传递到函数参数得同样技术。有关 Value 与 Locator 结构得详细资料,请参见 外部库得参数。
下面示例举例说明了如何可以使用 Value 与 Locator 结构在 ActiveX 控件中访问 Visual FoxPro 变量。
复制代码
long CFoxtlibCtrl::TLGetTypeAttr(long pTypeInfo, LPCTSTR szArrName)
{
int nResult = 1;
TYPEATTR *lpTypeAttr;
Locator loc;
Value val;
OLECHAR szGuid[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); //Array argument not of proper size、
}
//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、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_handle);
//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 提供了对 Visual FoxPro 动态内存管理器得直接访问。请求内存分配得 API 例程返回识别内存得内存句柄。Visual FoxPro 使用句柄而不就是指针分段加载结构,以便可以更有效地管理内存。
内存句柄实际上就是指针数组中得索引。该指针指向 Visual FoxPro 掌握得内存块。API 中几乎所有对内存得引用都就是通过几柄而不就是更传统得 C 指针来实现。
理解堆栈
所创建得控件或库并不具有自己得内存堆栈。相反,它使用调用程序得内存堆栈,或这里得 Visual FoxPro 堆栈。然而,无法控制 Visual FoxPro 堆栈得大小或影响 ActiveX 控件或 FLL 可用堆栈空间得总数。
在正常情况下,这个差别并不重要。Visual FoxPro 堆栈通常大到足以支撑可能要在控件或库中指派得自动变量。如果用完了堆栈空间,始终可以动态地在堆栈上指派额外得内存。
使用句柄得规则
下列规则适用于内存句柄得指派与释放:
用户必须释放她们指派得所有句柄,包括通过 _Load() 之类函数指派得句柄。
_Load() 只在所加载得变量就是字符串(即,ev_type = 'C')时才创建句柄。所有其她数据类型在它自己得 Value 结构中存储其值,而字符串得加载将 MHANDLE 放置到 Value 结构得 ev_handle 中。
在 FLL 库中,Visual FoxPro 负责释放所有用 _RetVal( ) 返回得句柄。即使用户指派了它们,也不能释放这些句柄。
用户不能释放 ParamBlk 中传递得句柄。
警告:
当编写调用函数得外部例程序时,确定遵从了所有规则并检查了返回结果。迷失得指针与句柄引用可以损害 Visual FoxPro 内部数据结构,导致直接得异常终止或遗留得问题,可以导致数据丢失。
七、如何管理内存
可以使用 Visual FoxPro API 分配与管理内存。
注意:
所描述得技术适用于 ActiveX 控件与 FLL 库。
要分配与使用内存
用 _AllocHand( ) 分配句柄。
用 _HLock( ) 锁定句柄。
用 _HandToPtr( ) 将句柄转换为指针。
通过使用指针来引用内存。
用 _HUnLock( ) 解锁句柄。
注意:
要避免损坏备注文件,在调用 _AllocMemo( ) 之前不要写备注文件。
为了确定已分配内存得地址,API 例程必须调用 _HandToPtr( ) 例程将句柄转换为指针。即使 Visual FoxPro 内存管理器需要重新组织内存以便为后来得内存请求获取更加连续得内存,该句柄也保持不变。同时还提供了增加、减少、释放与锁定内存分配得例程。
在创建外部例程时,应尽量减少内存得使用。如果创建了动态分配内存得外部例程,尽可能少地使用内存。对于长时间锁定大量内存分配时要特别小心。记住在不再需要锁定时用 _HUnLock( ) 解锁内存句柄,因为锁定内存句柄会对 Visual FoxPro 得性能产生不利影响。
警告:
过多地使用动态内存会侵占 Visual FoxPro 缓冲、窗口、菜单等得内存,并导致性能降低,因为满足 API 需求得内存就是由 Visual FoxPro 内存管理器进行管理得。分配大量句柄并保留它们可以导致 Visual FoxPro 用完内存并异常终止。Visual FoxPro 环境不具备内存保护。外部 API 例程不能完全提供标准 Visual FoxPro 程序中固有得检验。如果破坏了内存,将会接受到“跨越句柄(Transgressed handle)”、“内部一致性错误(Internal consistency error)” 与 “压缩过程中跨越节点(Transgressed node during paction)” 之类得信息。
下面 FLL 库中得函数举例说明了内存得分配。该示例使用 _RetDateStr( ) 返回了一个 Visual FoxPro 日期型 类型(假定 Character 参数就是正确得日期):
复制代码
#include <Pro_ext、h>
void dates(ParamBlk *parm)
{
MHANDLE mh;
char *instring;
if ((mh = _AllocHand(parm->p[0]、val、ev_length + 1)) == 0) {
_Error(182); // "内存不足"
}
_HLock(parm->p[0]、val、ev_handle);
instring = _HandToPtr(parm->p[0]、val、ev_handle);
instring[parm->p[0]、val、ev_length] = '\0';
_RetDateStr(instring);
_HUnLock(parm->p[0]、val、ev_handle);
}
FoxInfo myFoxInfo[] = {
{"DATES", (FPFI) dates, 1, "C"}
};
FoxTable _FoxTable = {
(FoxTable *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};
八、FoxInfo 结构
FoxInfo 结构被用于在 Visual FoxPro 与 FLL 库直接传递函数名与参数描述信息。
下列代码举例说明了 FoxInfo 结构得语法:
复制代码
FoxInfo arrayname[ ] = {
{funcName1, FPFI function1, parmCount1, parmTypes1}
{funcName2, FPFI function2, parmCount2, parmTypes2}
、 、 、
{funcNameN, FPFI functionN, parmCountN, parmTypesN}
};
下表描述了结构中得参数。
参数
说明
arrayname
指定 FoxInfo 类型得变量。
注意:
可以在该数组中包含几个 FoxInfo 结构行。
funcName
包含 Visual FoxPro 对函数调用得调用名。
function
指定 C 语言例程得地址。这就是用于定义函数得精确(区分大小写)得名称。
parmCount
指定 parmTypes 串中描述得参数数量或下列标记值之一。下面得列表描述了可能得标记值:
INTERNAL
指定该函数不能直接从 Visual FoxPro 中调用。
CALLONLOAD
指定该例程在库被加载时调用。CALLONLOAD 不能调用任何将结果返回给 Visual FoxPro 得例程。
CALLONUNLOAD
指定该例程在库被卸载或发出 Visual FoxPro 得 QUIT 命令时调用。CALLONUNLOAD 不能调用任何将结果返回给 Visual FoxPro 得例程。
parmTypes
描述每个参数得数据类型。
下面列示了 parmTypes 得有效值。
" "
无参数。
"?"
指定可以传递任何类型。在函数体中,将需要检查传递来参数得类型。
"C"
指定 字符型 类型参数。
"D"
指定 日期型 类型参数。
"I"
指定 整数(Integer) 类型参数。
"L"
指定 逻辑型 类型参数。
"N"
指定 数值型 类型参数。
"R"
引用。
"T"
指定 日期时间型 类型参数。
"Y"
指定 货币型 类型参数。
"O"
指定 对象(Object) 类型参数。
注意:
为每个传递到库中得参数包含一个类型值。要表示一个参数就是可选得,在前面加上句点(、)。只有后面得参数可以被省略。
例如,假设创建了接收字符与数值参数得函数。当指定 parmType 时,使用 "CN"。
下面示例得 FoxInfo 结构定义了带有一个内部名为 dates 而外部用 DATES 访问得函数得库。该结构接收一个 字符型 类型得参数:
复制代码
FoxInfo myFoxInfo[] = {
{ "DATES", (FPFI) dates, 1, "C" }
};
在编译这个带有 FoxInfo 结构得 FLL 库并在 Visual FoxPro 中使用 SET LIBRARY 命令加载之后,就可以在 Visual FoxPro 中用下列命令行调用该函数:
复制代码
=DATES("01/01/95")
展开阅读全文