求高手把这个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
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
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代码我自己写也行,先在这里谢谢各位了
这个,大哥,能麻烦你给我写个vb的调用代码吗?不是我懒,这个copymemory什么的我确实不会,谢谢你来
这个怪我,我忘记说了这个ocr—c 是一个dll的内建函数(就像sendmessage),上面的声明是声明一个dll内置函数的,不需要知道过程,这个东西返回的就是图片识别后的结果我现在就是不明白 这个ocr——c的参数是什么,反正直接用字符串参数调用 不成功,所有我想知道上面的汇编代码到底做什么的??
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推测的求高手指点
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代码了
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;
}
谢谢你兄弟~
你的解释让我基本上完全明白了,你是最理解我要问什么的人,谢谢~
另外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个变量是定义成字符串我看的懂,那返回值呢
例如 foo(a, b) 如果调用约定是stdcall,那么生成的汇编就是
push b ;最后的参数最先入栈
push a
call foo也就是说,原帖中ocr_identity的参数顺序和ocr_c函数的参数顺序刚好相反。