为了对抗UNFOX及内部的加密, 原来VFP中的常用函数要转到FLL中.
Function
glEqual
Lparameters tuVar1,tuVar2,tlIgnoreSpace
*- 判断两个变量是否相等
*- 变量的类型可不相同, 类型不同当然不等
*- null 等于 null
*-
If Parameters() < 3
tlIgnoreSpace = .T.
Endif
If Isnull (tuVar1) And Isnull (tuVar2)
Return .T.
Endif
If Isnull (tuVar1) And ! Isnull (tuVar2) Or ! Isnull (tuVar1) And Isnull (tuVar2)
Return .F.
Endif
If Vartype (tuVar1) <> Vartype (tuVar2)
Return .F.
Endif
If tlIgnoreSpace And Vartype (tuVar1) = ' C'
Return Trim (tuVAR1) == Trim (tuVAR2)
Else
Return tuVAR1 == tuVAR2
Endif
Lparameters tuVar1,tuVar2,tlIgnoreSpace
*- 判断两个变量是否相等
*- 变量的类型可不相同, 类型不同当然不等
*- null 等于 null
*-
If Parameters() < 3
tlIgnoreSpace = .T.
Endif
If Isnull (tuVar1) And Isnull (tuVar2)
Return .T.
Endif
If Isnull (tuVar1) And ! Isnull (tuVar2) Or ! Isnull (tuVar1) And Isnull (tuVar2)
Return .F.
Endif
If Vartype (tuVar1) <> Vartype (tuVar2)
Return .F.
Endif
If tlIgnoreSpace And Vartype (tuVar1) = ' C'
Return Trim (tuVAR1) == Trim (tuVAR2)
Else
Return tuVAR1 == tuVAR2
Endif
如果全用C++语法,做小小东西也会比较麻烦,工作量也会比较大。
下面的代码,未够上段完善,如果和上段VFP函数一样的功能,麻烦还有不少。
void FAR glEqual(ParamBlk FAR * parm)
{
Value result;
int nIgnoreSpace ;
char FAR * cStr;
if ( parm -> p[ 0 ].val.ev_type != parm -> p[ 1 ].val.ev_type )
{
_RetLogical( 0 );
return ;
}
// -----
switch (parm -> p[ 0 ].val.ev_type)
{ // object,memo,gen,currency未有对比. 字符串,未去空格,未ingoreCase
case ' 0 ' :
_RetLogical( 1 );
break ;
case ' N ' :
_RetLogical(parm -> p[ 0 ].val.ev_real == parm -> p[ 1 ].val.ev_real );
break ;
case ' I ' :
_RetLogical(parm -> p[ 0 ].val.ev_real == parm -> p[ 1 ].val.ev_real );
break ;
case ' D ' :
_RetLogical(parm -> p[ 0 ].val.ev_real == parm -> p[ 1 ].val.ev_real );
break ;
case ' T ' :
_RetLogical(parm -> p[ 0 ].val.ev_real == parm -> p[ 1 ].val.ev_real );
break ;
case ' L ' :
_RetLogical(parm -> p[ 0 ].val.ev_length == parm -> p[ 1 ].val.ev_length );
break ;
case ' C ' :
NullTerminate( & parm -> p[ 0 ].val);
NullTerminate( & parm -> p[ 1 ].val);
RetValue = _StrCmp( ( char * ) _HandToPtr(parm -> p[ 0 ].val.ev_handle), ( char * ) _HandToPtr(parm -> p[ 1 ].val.ev_handle));
_RetLogical(RetValue == 0 );
break ;
default :
_RetLogical( 0 );
}
}
折中办法,部分的处理以VFP进行。 就是在C++里,将值又转为VFP的变量,以_Evaluate利用VFP计算求值,待VPF计算好了再将结果放回C++变量中。
这样做可以说是在C++里混合VFP编程,见效快。
VFP混合C++,C++又混合VFP,你中有我我中有你。不亦快哉。
C++中混合VFP的方法:
(1)以 _Evaluate(&Val, char * cVfpExpr),实现VFP运算值到C++ 值的转换
(2)自写一函数,_Value2FoxVar(Value val, char FAR * cpVarName), 实现C++值到VFP变量的转换。
_Value2FoxVar代码如下
int
_Value2FoxVar(Value val,
char
FAR
*
cpVarName)
{
/* c值(value结构)到fox变量 -> 利于以fox语句去做计算等,
_Value2FoxVar(VALUE * val, char * cpVarName)
如FOX变量不存在,就创建一个private的.然后将val放入
.
*/
NTI nti;
Locator loc;
nti = _NameTableIndex(cpVarName);
if ( _FindVar(nti, - 1 , & loc) == false )
{
CreateVar(cpVarName, 1 ); // 找不到变量,创建一个
nti = _NameTableIndex(cpVarName);
if ( _FindVar(nti, - 1 , & loc) == false )
{ HandleExceptionError( " nnd,创建变量竟然失败。 " );
return 0 ;
}
}
_Store( & loc, & val);
return 1 ;
}
{
/* c值(value结构)到fox变量 -> 利于以fox语句去做计算等,
_Value2FoxVar(VALUE * val, char * cpVarName)
如FOX变量不存在,就创建一个private的.然后将val放入
![dot.gif](/Images/dot.gif)
NTI nti;
Locator loc;
nti = _NameTableIndex(cpVarName);
if ( _FindVar(nti, - 1 , & loc) == false )
{
CreateVar(cpVarName, 1 ); // 找不到变量,创建一个
nti = _NameTableIndex(cpVarName);
if ( _FindVar(nti, - 1 , & loc) == false )
{ HandleExceptionError( " nnd,创建变量竟然失败。 " );
return 0 ;
}
}
_Store( & loc, & val);
return 1 ;
}
有了以上的准备,glEqual转为C++/FLL函数,在要求很完善的情况下,处理也是比较简单。这个简单的处理不怕HexEditor,只有小量VFP源码,看不出思路门道的。
void
FAR glEqual(ParamBlk FAR
*
parm)
{
Value result;
int nIgnoreSpace ;
char FAR * cStr;
if ( parm -> p[ 0 ].val.ev_type != parm -> p[ 1 ].val.ev_type )
{
_RetLogical( 0 );
return ;
}
// -----
if (parm -> p[ 1 ].val.ev_type == ' 0 ' ) // null
{
_RetLogical( 1 );
return ;
}
if (parm -> pCount < 3 )
nIgnoreSpace = 1 ;
else
nIgnoreSpace = parm -> p[ 2 ].val.ev_length ;
_Value2FoxVar(parm -> p[ 0 ].val, " _fll_tmp1 " ); //将值转为VFP变量的值,此变量如原来不存在,创建
_Value2FoxVar(parm -> p[ 1 ].val, " _fll_tmp2 " );
if (parm -> p[ 0 ].val.ev_type == ' C ' && nIgnoreSpace == 1 )
cStr = " trim(_fll_tmp1)==trim(_fll_tmp2) " ;
else
cStr = " _fll_tmp1 == _fll_tmp2 " ;
if ( _Evaluate( & result, cStr ) != 0 ) //通过VFP,计算,求值。放到result中
{
HandleExceptionError( " glEqual -> _Evaluate 出错。 " );
return ;
}
else
_RetLogical( ( int ) result.ev_length );
_FreeHand(result.ev_handle);
}
{
Value result;
int nIgnoreSpace ;
char FAR * cStr;
if ( parm -> p[ 0 ].val.ev_type != parm -> p[ 1 ].val.ev_type )
{
_RetLogical( 0 );
return ;
}
// -----
if (parm -> p[ 1 ].val.ev_type == ' 0 ' ) // null
{
_RetLogical( 1 );
return ;
}
if (parm -> pCount < 3 )
nIgnoreSpace = 1 ;
else
nIgnoreSpace = parm -> p[ 2 ].val.ev_length ;
_Value2FoxVar(parm -> p[ 0 ].val, " _fll_tmp1 " ); //将值转为VFP变量的值,此变量如原来不存在,创建
_Value2FoxVar(parm -> p[ 1 ].val, " _fll_tmp2 " );
if (parm -> p[ 0 ].val.ev_type == ' C ' && nIgnoreSpace == 1 )
cStr = " trim(_fll_tmp1)==trim(_fll_tmp2) " ;
else
cStr = " _fll_tmp1 == _fll_tmp2 " ;
if ( _Evaluate( & result, cStr ) != 0 ) //通过VFP,计算,求值。放到result中
{
HandleExceptionError( " glEqual -> _Evaluate 出错。 " );
return ;
}
else
_RetLogical( ( int ) result.ev_length );
_FreeHand(result.ev_handle);
}