FLL - C++与VFP 双向混合编程


为了对抗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放入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); 
}




转载于:https://www.cnblogs.com/maxchan/archive/2007/10/12/922129.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值