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
Locator
用于访问参数值(FLL)或VisualFoxPro变量或字段(FLL和ocx)的结构。
ParamBlk
Parameter
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_length0或1备注型ev_type'M' ev_wdithFCHAN ev_long备注字段长度 ev_real备注字段偏移量通用(General)ev_type'G' ev_wdithFCHAN ev_long通用型字段长度 ev_real通用型字段偏移量对象(Object)ev_type'O' ev_object对象标识符Nullev_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参数。复制代码#includeExample(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例程,可以使用下列模板: 复制代码#includevoidInternal_Name(ParamBlk*parm){//Functioncodegoeshere.}FoxInfomyFoxInfo[]={{"FUNC_NAME",(FPFI)Internal_Name,0,""},};FoxTable_FoxTable={(FoxTable*)0,sizeof(myFoxInfo)/sizeof(FoxInfo),myFoxInfo};对于C++例程,在下列模板中需要声明FoxTable作为外部结构: 复制代码#includevoidInternal_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=GuidStringFromGUID2(lpTypeAttr->guid,(LPOLESTR)&szGuid,sizeof(szGuid));OLEOleToAnsiString(szGuid,&szBuff);val.ev_type='C';val.ev_length=strlen(szBuff);val.ev_handle=_AllocHand(val.e
//将字段值放置到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,接收一个字符型参数的函数的库:
{"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{
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
数值型
'N'
ev_width
显示宽度
小数位
ev_real
双精度
整型(Integer)
'I'
ev_long
长整型(Longinteger)
日期型
'D'
日期1
日期时间(DateTime)
'T'
日期+(秒/86400.0)
货币型
'Y'
ev_currency
货币值2
逻辑型
'L'
0或1
备注型
'M'
ev_wdith
备注字段长度
备注字段偏移量
通用(General)
'G'
通用型字段长度
通用型字段偏移量
对象(Object)
'O'
ev_object
对象标识符
Null
'0'(零)
1.日期被表现为使用ACM算法集合中199算法(Algorithm199fromCollectedAlgorithmsoftheACM)计算出来的双精度浮点儒略(Julian)日数字。
2.货币值是长整型,在最后四个阿拉伯数字之前带有隐含的小数点。
ev_length是串长度的唯一真实的指示器。
由于串可以包含内置的null字符,因此串不能以null作为终止符。
Locator结构定义
使用Locator结构操作通过引用传递的参数。
下面的Locator结构定义是从Pro_ext.h文件提取的:
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
表中的域编号。
l_subs
只用于变量,下标的编号(0–2)。
l_sub1
只用于变量,如果l_subs不是0,则为第一个下标。
l_sub2
只用于变量,如果l_subs是2,则为第二个下标。
检查ev_type中的参数类型以帮助确定从Valuestructure接收的是哪几个域是良好的设计习惯。
访问FLL库中参数示例
下面示例使用_StrCpy()将字符型类型返回给VisualFoxPro,那是其两个字符型参数的串联。
注意,尽管每个参数Value结构的句柄被用于操作内存以完成该串联,但改变内存的分配不影响通过值传递的VisualFoxPro参数。
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);
{"STRCAT",Example,2,"CC"},
四、创建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例程,可以使用下列模板:
voidInternal_Name(ParamBlk*parm)
//Functioncodegoeshere.
{"FUNC_NAME",(FPFI)Internal_Name,0,""},
对于C++例程,在下列模板中需要声明FoxTable作为外部结构:
extern"C"{
五、访问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;
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