求高手把这个dephi 掺杂汇编 翻译成vb??或者解释下意思也行,感谢! function OcrInit:boolean;stdcall ; external 'AdvOCR'  ;
 procedure OcrDone ;stdcall;external 'AdvOCR';         // Destroy
 procedure  OCR_C(var picType:string;var picName:string);stdcall;external 'AdvOCR'; function  OCR_identify (picName,types:string):string;
var
  u1,u2,u3,u4:byte;
begin
  asm
    push picName
    push types
    call ocr_c
    xor ecx,ecx
    mov cl,byte ptr [eax]
    mov u1,cl
    mov cl,byte ptr[eax+1]
    mov u2,cl
    mov cl,byte ptr[eax+2]
    mov u3,cl
    mov cl,byte ptr[eax+3]
    mov u4,cl
  end;
result:=chr(u1)+chr(u2)+chr(u3)+chr(u4);
end; 调用: b:= 'alibaba';//库中一种识别类型
      a:=图片;
 edit1.Text:= OCR_identify(a,b);RT

解决方案 »

  1.   

     
    function  OCR_identify (picName,types:string):string;
    var
      u1,u2,u3,u4:byte;
    begin
      asm
        push picName
        push types
        call ocr_c
        xor ecx,ecx
        mov cl,byte ptr [eax]
        mov u1,cl
        mov cl,byte ptr[eax+1]
        mov u2,cl
        mov cl,byte ptr[eax+2]
        mov u3,cl
        mov cl,byte ptr[eax+3]
        mov u4,cl
      end;
    result:=chr(u1)+chr(u2)+chr(u3)+chr(u4);
    end这段我完全看不懂,我想知道,他到底是对picName,types 2个参数 做了什么,什么连怎么调用dll函数都没发现,唉,更别提调用上面的dll并处理返回值 ,我是学vb的,我想用vb调用这个dll,但是我不知道参数是什么,好不容易用各种引擎找了2天才找到了这个文章,想请各位大大,帮我分析下,处理过程,vb代码我自己写也行,先在这里谢谢各位了
      

  2.   

    OCR识别?深了。这段代码的精髓在于call ocr_c,你贴的只是一部分
      

  3.   

    感觉你的代码是反编译来的Delphi代码。其实很简单,你直接调用AdvOCR就可以了。函数声明应该是 char ocr_c(char * types, char * picname)
      

  4.   

    这个汇编代码其实很简单,就是标准的 stdcall 方式调用 dll 中的函数。将参数从后往前推入堆栈,然后call开始调用。调用完成返回一个指针,放在eax寄存器里面,指向一个4字节的地址。VB要调用的话很简单,用 CopyMemory 拷贝到数组或者结构体里面就可以了。
      

  5.   


    这个,大哥,能麻烦你给我写个vb的调用代码吗?不是我懒,这个copymemory什么的我确实不会,谢谢你来
      

  6.   


    这个怪我,我忘记说了这个ocr—c 是一个dll的内建函数(就像sendmessage),上面的声明是声明一个dll内置函数的,不需要知道过程,这个东西返回的就是图片识别后的结果我现在就是不明白 这个ocr——c的参数是什么,反正直接用字符串参数调用 不成功,所有我想知道上面的汇编代码到底做什么的??
      

  7.   

    上面声明的3个函数都是dll的内置函数,ocr—c这个函数 参数好像是2个字符串格式的,但是返回值是什么格式的我到现在没搞明白(vb的,我是学vb的) 现在这个asm里面阐述了这个函数如何调用和返回值转换成字符串的过程,但是我不懂反汇编,所有不知道什么意思,我想知道 如果用vb 如何调用这个ocr—c 并且吧结果转换成字符串?????
      

  8.   

    VB中用汇编,需要clsASM.cls这个类,网上应该有的下载否则只能把这些汇编翻译成机器码,用WriteProcessMemory函数写入到内存中了这里面的东西有些复杂的
      

  9.   

    Public Declare Sub IMG2BMP Lib "E:\down\advocr\AdvOCR.dll" Alias "IMG2BMP" (filename As Any)
    Public Declare Function OcrInit Lib "E:\down\advocr\AdvOCR.dll" Alias "OcrInit" () As Boolean
    Public Declare Sub OcrDone Lib "E:\down\advocr\AdvOCR.dll" Alias "OcrDone" ()
    Public Declare Function OCR_C Lib "E:\down\advocr\AdvOCR.dll" Alias "OCR_C" (OCR_type As String, filename As String) As String  '声明部分是我根据delphi那段代码推测出来的不知道是否正确StrSSS=OCR_C("alibaba",app.path & "\1.bmp") 
    text1.text=strsss结果text1 为空白,也就是说没有任何字符,我用这个软件的demo识别这个bmp图像是完全正确的识别出来了,也就是说 我上面的调用方式不正确  或者(经过这今天你们的回答推测) 返回值需要处理才能行。当然也有可能我的dll声明也存在错误??? 我是根据delphi推测的求高手指点 
      

  10.   


    function OcrInit:boolean;stdcall ; external 'AdvOCR'  ;
     procedure OcrDone ;stdcall;external 'AdvOCR';         // Destroy
     procedure  OCR_C(var picType:string;var picName:string);stdcall;external 'AdvOCR'; function  OCR_identify (picName,types:string):string; // 迷惑性的参数顺序,实际参数命名应该交换一下
    var
      u1,u2,u3,u4:byte;
    begin
      asm
        push picName
        push types
        call ocr_c        ; stdcall调用, 此处相当于 ocr_c(types, prcName); 所以说上边参数命名很迷惑
        xor ecx,ecx            ;
        mov cl,byte ptr [eax]     ;因为call ocr_c后返回的结果在eax,看上下文应该是返回一个指针,下面几句的意思是将指针指向的地址随后的四个字节的值分别存放到u1到u4    mov u1,cl
        mov cl,byte ptr[eax+1]
        mov u2,cl
        mov cl,byte ptr[eax+2]
        mov u3,cl
        mov cl,byte ptr[eax+3]
        mov u4,cl
      end;
    result:=chr(u1)+chr(u2)+chr(u3)+chr(u4);  将u1到u4四个ascii码转换成4个字符,然后联成字符串,然后返回result。 result在delphi中比较特殊,代表函数的返回值
    end; 调用: b:= 'alibaba';//库中一种识别类型
          a:=图片;
     edit1.Text:= OCR_identify(a,b);    // 这个意思就是将调用ocr_identify后的字符串显示在窗口的text输入框中我不会vb编码,只能试着解释一下这段delphi代码了
      

  11.   

    给你发个C语言版
    char str[5] = {0};  // 返回值一会儿放到这儿
    char *OCR_identify(char *picName, char *types)
    {
    unsigned char u1, u2, u3, u4;
    char *p;
    p = ocr_c(types, picName);  // 该函数在dll中,需要在头文件引入,或者动态载入
    u1 = *p;
    u2 = *(p+1);
    u3 = *(p+2);
    u4 = *(p+3);
    sprintf(str, "%c%c%c%c", u1, u2, u3, u4);
    return str;
    }
      

  12.   


    谢谢你兄弟~
    你的解释让我基本上完全明白了,你是最理解我要问什么的人,谢谢~
    另外1个没太懂的 还望指点下
    1. 为了方便问,我用中文名代表变量
    类型=“alibaba”  ‘这个alibaba是指阿里巴巴网站的验证图片,他库里有这个类型,我知道的 字符串形式
    图片=图片路径。。
     edit1.Text:= OCR_identify(“图片”,“类型”)
    那么:
    call ocr_c     ; stdcall调用, 此处  ?是否?  相当于 ocr_c(类型, 图片) ????? 也就是说哪个第一个参数到底是图片路径还是 类型呢?补充一个 ,
    procedure  OCR_C(var picType:string;var picName:string);stdcall;external 'AdvOCR';
    这个定义里 ocr—c这函数 返回值定义是什么类型??? 2个变量是定义成字符串我看的懂,那返回值呢
      

  13.   

    stdcall调用的时候,在汇编级别参数是倒序压栈的。
    例如 foo(a, b) 如果调用约定是stdcall,那么生成的汇编就是
    push b   ;最后的参数最先入栈
    push a
    call foo也就是说,原帖中ocr_identity的参数顺序和ocr_c函数的参数顺序刚好相反。
      

  14.   

    ocr_c的返回值根据程序来看,肯定是个指针,你将这个指针强制转化成char*型指针,方便操作。我上边贴的c代码直接当作char指针了。