惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
罗磊的独立博客
T
The Blog of Author Tim Ferriss
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
Last Week in AI
Last Week in AI
美团技术团队
Google Online Security Blog
Google Online Security Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
D
Docker
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件
月光博客
月光博客
L
LINUX DO - 最新话题
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
W
WeLiveSecurity
H
Heimdal Security Blog
Vercel News
Vercel News
SecWiki News
SecWiki News
Forbes - Security
Forbes - Security
Blog — PlanetScale
Blog — PlanetScale
Google DeepMind News
Google DeepMind News
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
TaoSecurity Blog
TaoSecurity Blog
T
Troy Hunt's Blog
A
About on SuperTechFans
C
Check Point Blog
S
Security Affairs
Hacker News - Newest:
Hacker News - Newest: "LLM"
AI
AI
WordPress大学
WordPress大学
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Help Net Security
Help Net Security
博客园_首页
The Last Watchdog
The Last Watchdog
S
SegmentFault 最新的问题
Hugging Face - Blog
Hugging Face - Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Engineering at Meta
Engineering at Meta
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
I
Intezer
K
Kaspersky official blog
M
MIT News - Artificial intelligence
J
Java Code Geeks
G
GRAHAM CLULEY
P
Palo Alto Networks Blog

博客园 - max chan

企业管理软件开发XP iframe 高度自动调节,最简单解决 被逼上 Visual Studio 2008 被逼上 visual studio 2005 超级gnFindWindow C++ 松花江上 函数glDefinePopup(),动态定义多级的popup菜单 复习 树-递归 全面自定义 - 代码挂接 设计原则 聪明与代价 VFP程序,全面自定义之表单/类 VFP通用代码(vcx/scx/prg)混淆器,可以下载了 备份策略 死里逃生 先舍后得 VFP -> dot net 过渡 -- foxpro toolkit for dot net VFP与DOT NET之间的过渡 - SEDNA
FLL - C++与VFP 双向混合编程
max chan · 2007-10-12 · via 博客园 - max chan


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