Delphi/Tesseract OCR:有人可以帮我在Delphi中使用这个新的DLL吗?

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源文件:[检查网站上下载页面上的源文件]

谢谢你的帮助.

Jen*_*off 6

从第一眼看,这可能很难.由于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" {指令使用名称修改.

至少还有两个问题:

  • 您没有从Delphi确定C++对象实例大小的方法
  • 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,抱歉.