Ric*_*olf 3 delphi ocr dll tesseract
谷歌一直在开发这个伟大的开源OCR组件:http: //code.google.com/p/tesseract-ocr/
他们在2010年10月初推出了新版本(版本3).
但是这个新版本不再有一个可用的C包装器,并且Delphi社区中的某个人可以从Delphi内部开始工作 - 我正在尝试这样做,因为我非常需要它而没有其他人匆忙要做到这一点,但我不知道我在做DLL和将C转换为Delphi时正在做什么.那是我可以使用你的帮助的地方.
我所接受的线索是,我需要Dependency Walker以某种方式防止"名称错误"(不知道这意味着什么).实际的DLL API方法在C文件中 - 可能是您在Dependency-Walker中看到的DLL函数名称将匹配API文件中的函数.
以下是您需要提供帮助的所有内容:您需要一个包含tessdll.dll的文件夹,并且leptonlib.dll只需要在那里.你需要一个名为'tessdata'的子文件夹,在文件夹里面将是你的'语言数据文件' - [查看网站上的下载页面]
这是Windows安装程序,因此您可以看到DLL正在运行:[查看网站上的下载页面]
为了使这适用于Delphi,您将可执行文件放在与DLL相同的文件夹中.然后,您需要知道在DLL中调用什么,为此您可以查看C源文件:[检查网站上下载页面上的源文件]
谢谢你的帮助.
从第一眼看,这可能很难.由于API显然封装在C++类中,唯一干净的方法是:
在C中实现一个包装器DLL,它暴露了类的flattented接口,这样你就可以编写一个Delphi单元来使用它.
这里概述了这个原则:
http://rvelthuis.de/articles/articles-cppobjs.html
直接使用C++ API需要一些聪明的汇编程序黑客攻击.这里不仅有名称修改问题,还有用于创建DLL(即Visual Studio 2008 Express)的C++编译器的调用约定.
因此,有人必须首先使用Visual C++ 2008 Express使用C API编写DLL.
一些澄清说明您的意见:
如果要在应用程序中使用外部库,则需要知道需要导入哪些符号.
一个正常的符号是kernel32.dll中的'SetDllDirectory'.在Delphi中导入它没有问题,但C++通常使用一种更人为的方式来命名它的符号.一个例子是'_ZN·9wikipedia·7article·6format·E'(摘自本文:http://en.wikipedia.org/wiki/Name_mangling)
虽然可以导入一个受损的符号,但这只是问题的一小部分.
您可以告诉C++编译器不使用该extern "C" {指令使用名称修改.
至少还有两个问题:
this参数(如Delphi中的Self)通过编写Rudy的文章中解释的包装器可以避免这些问题.
你必须编写一个简单的C++ Dll来导出一个普通的C API(没有修改和正常的C函数),在伪代码中看起来像这样:
extern "C" {
void* MakeAnInstanceOfDesiredClass(void)
{
return new DesiredClass();
}
void DestroyInstanceOfDesiredClass(void* instance)
{
delete instance;
}
int SomeMethodOfDesiredClass(void* instance)
{
return reinterpret_cast<DesiredClass*>(instance)->SomeMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
我试试看,但我的网络连接速度很慢,我这里没有Visual Studio,抱歉.