2010-10-29 1 views
3

Там не этот большой открытого исходный код OCR компонент, который Google разрабатывает: http://code.google.com/p/tesseract-ocr/Delphi/Tesseract OCR: Может кто-нибудь помочь мне получить эту новую DLL, работающую в Delphi?

Они имеют новую версию из (версия 3) в начале октября 2010 года

Но эта новая версия больше не имеет рабочую оболочку C, и кто-то из сообщества Delphi может заставить его работать изнутри Delphi - я пытаюсь это сделать, потому что мне это очень нужно, и никто не спешит это делать, но у меня есть не знаю, что я делаю, когда дело доходит до DLL и конвертирует C в Delphi. Вот где я могу использовать вашу помощь.

Ключи, которые я выбрал, это то, что мне нужен Dependency Walker, чтобы каким-то образом предотвратить «манипулирование именами» (не знаю, что это значит). Фактические методы API DLL находятся в файлах C - и, предположительно, имена функций DLL, которые вы видите в Dependency-Walker, будут соответствовать функциям в файле API.

Здесь вы можете помочь: Вам понадобится папка с tessdll.dll, а также leptonlib.dll просто должно быть там. Вам понадобится подпапка под названием «tessdata», а внутри папки будут ваши «языковые файлы данных» - [проверить страницу загрузки на сайте]

Вот установка Windows, чтобы вы могли видеть DLL в действии : [проверить страницу загрузки на сайте]

Чтобы получить эту работу для Delphi, вы получите свой исполняемый файл в той же папке, что и DLL. тогда Вы должны знать, что позвонить в DLL, и что вы можете посмотреть в файлах C Источник: [проверить исходные файлы на странице загрузки на сайте]

Спасибо за любую помощь.

ответ

6

С первого взгляда это может быть сложно. Поскольку API явно инкапсулирован в класс C++, единственным чистым способом сделать это будет:

Внедрите DLL-оболочку в C, которая предоставляет плоский интерфейс класса, чтобы вы могли написать блок Delphi для его использования.

Принцип изложен здесь:

http://rvelthuis.de/articles/articles-cppobjs.html

непосредственно с помощью ++ API C потребует некоторого умного ассемблере взлома. Здесь не только проблема с именем, но и вызывающее соглашение компилятора C++, которое использовалось для создания DLL (это Visual Studio 2008 Express).

Итак, кому-то нужно сначала написать DLL с API C, используя Visual C++ 2008 Express.

Некоторые разъяснения concering ваши комментарии:

Если вы хотите использовать внешнюю библиотеку в вашем приложении вы должны знать, какие символы нужно импортировать.

Нормальным символом будет «SetDllDirectory» в файле kernel32.dll. Нет проблем с импортом в Delphi, но C++ обычно использует более изобретательный способ для обозначения своих символов.Примером может служить «_ZN · 9wikipedia · 7article · 6format · E» (взято из этой статьи: http://en.wikipedia.org/wiki/Name_mangling)

Хотя можно импортировать искаженный символ, который является лишь незначительной частью проблемы.

Вы можете сказать, что компилятор C++ не использует управление именами, используя директиву extern "C" {.

Там все еще по крайней мере две дополнительные проблемы:

  • У вас нет способа определить размер C++ экземпляр объекта из Дельф
  • Все методы в C++ объект взять скрытый this аргумент (например, Self in Delphi)

Эти проблемы можно обойти, написав обертку, как описано в статье Руди.

Вы должны написать ++ Dll простой C, который экспортирует нормальный 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(); 
} 

} 

Я бы дать ему попробовать , но мое подключение к Интернету довольно медленное, и у меня нет Visual Studio здесь, извините.

+0

Спасибо за этот ответ, он проливает некоторый свет. Тем не менее, я все еще довольно смущен. Я загрузил Visual C++ 2010, потому что я отчаянно нуждаюсь в том, чтобы получить версию 3, поэтому я мог бы попробовать сделать это сам, но я совершенно не согласен с этим и все еще очень смущен. Как, исходный код в чем, C, C++? Можно ли скомпилировать оба языка из Visual C++ 2010? Есть DLL-версия Windows DLL, которую вы можете скачать - конечно, это все, что нужно Delphi? ... Итак, из того, что вы говорите, у меня нет никаких шансов получить это право как скромный программист Delphi. –

+0

Кроме того, что такое «название мангинга»? –

+0

Dll никогда не были предназначены для экспорта методов объекта. Управление именем работает вокруг этого, используя специально отформатированное имя функции. Информация о методе каретки варьируется от одного языка к другому (и даже одного производителя компилятора к другому). Delphi использует имя mangling в своем формате bpl (который является dll под капотом). –

2

На самом деле после того, как более пристально взглянуть на документацию там может быть множество функций, которые до сих пор C API и, следовательно, доступными непосредственно из Delphi:

BOOL APIENTRY DllMain (HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
TESSDLL_API void __cdecl TessDllRelease() 
TESSDLL_API void *__cdecl TessDllInit (const char *lang) 
TESSDLL_API int __cdecl TessDllBeginPageBPP (uinT32 xsize, uinT32 ysize, unsigned char *buf, uinT8 bpp) 
TESSDLL_API int __cdecl TessDllBeginPageLangBPP (uinT32 xsize, uinT32 ysize, unsigned char *buf, const char *lang, uinT8 bpp) 
TESSDLL_API int __cdecl TessDllBeginPageUprightBPP (uinT32 xsize, uinT32 ysize, unsigned char *buf, const char *lang, uinT8 bpp) 
TESSDLL_API int __cdecl TessDllBeginPage (uinT32 xsize, uinT32 ysize, unsigned char *buf) 
TESSDLL_API int __cdecl TessDllBeginPageLang (uinT32 xsize, uinT32 ysize, unsigned char *buf, const char *lang) 
TESSDLL_API int __cdecl TessDllBeginPageUpright (uinT32 xsize, uinT32 ysize, unsigned char *buf, const char *lang) 
TESSDLL_API void __cdecl TessDllEndPage (void) 
TESSDLL_API ETEXT_DESC *__cdecl TessDllRecognize_a_Block (uinT32 left, uinT32 right, uinT32 top, uinT32 bottom) 
TESSDLL_API ETEXT_DESC *__cdecl TessDllRecognize_all_Words (void) 
TESSDLL_API void __cdecl ReleaseRecognize() 
TESSDLL_API void *__cdecl InitRecognize() 
TESSDLL_API int __cdecl CreateRecognize (uinT32 xsize, uinT32 ysize, unsigned char *buf) 
TESSDLL_API ETEXT_DESC *__cdecl reconize_a_word (uinT32 left, uinT32 right, uinT32 top, uinT32 bottom) 

Я не знаю, если эти функции достаточно, но они доступны напрямую.

+0

На самом деле я считаю, что эти функции предназначены для оболочки для последней версии 2.04 и лишены этой новой версии 3.0. на странице проблем сайта говорится об этой проблеме, и что для версии 3.0 должна быть написана новая оболочка C. –

1

Преобразование кода, который цитирует Jens, не должен быть слишком сложным. Вы можете попробовать конвертер C в Delphi (http://www.drbob42.com/delphi/headconv.htm, http://cc.embarcadero.com/item/26951). Помните, что они могут конвертировать только 60-80% кода, поэтому следует выполнить ручную работу. Если вы все еще застряли после всего этого, тогда выполните поиск, если существует VB-преобразование заголовка. Это будет намного проще, чем преобразование из C, тем более что преобразователь VB2Delphi может сделать это, возможно, без ручной работы после этого (http://www.marcocantu.com/tools/vb2delphi.htm).

Смежные вопросы