为了对抗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
如果全用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
;
}
有了以上的准备,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);
}