Delphi: не загружает DLL, если я не устанавливаю распространяемый Visual C ++ 2008 - PullRequest
0 голосов
/ 24 ноября 2010

У меня есть библиотека DLL, которая загружается в мое приложение, например:

procedure LoadTessDLL;
var
  DLLHandle: THandle;
begin
  DLLHandle := LoadLibrary(PChar(ExtractFilePath(application.exename) + 'tessdll.dll'));
  if DLLHandle >= 32 then
  begin
    TessDLLLoaded := True;

Мы обнаружили, что на ПК с XP с пакетом обновления 2 библиотека DLL не загружается (DLLHAndle = 0 и т. Д.), ЕСЛИ мы не устанавливаем распространяемый Microsoft Visual C ++ 2008. Затем он загружается и работает просто отлично.

Пожалуйста, вы можете помочь мне заставить это работать без него?

Ответы [ 6 ]

4 голосов
/ 24 ноября 2010

Вы контролируете исходную DLL? Если нет, то нет, DLL зависит от среды выполнения C ++ 2008, и она должна быть установлена ​​для запуска DLL, и вам необходимо добавить ее как часть вашей установки.

Если вы управляете источником для DLL, то статически связываете его со средой выполнения C ++, которая встроит среду выполнения в DLL.

Эта проблема не имеет ничего общего с Windows XP. Для DLL также требуется среда выполнения C ++ 2008 в Vista и 7, просто так получилось, что на машинах, на которых вы тестировали, она уже была установлена. Не гарантируется, что среда выполнения C ++ будет установлена ​​в любой версии Windows.

2 голосов
/ 24 ноября 2010

Если для DLL требуется распространяемый VS2008, тогда он нужен, и вы должны включить его в состав установщика вашего продукта.

Microsoft предоставляет распространяемый пакет для включения в другие установщики, и он предназначен для использования таким образом. (Он добавит один или два мегабайта к вашему установщику.)

Невозможно обойти эту проблему, если у вас нет источника для DLL, и вы можете перекомпилировать его для статической связи среды выполнения C.

(Даже если у вас есть исходный код, простая перекомпиляция со статическим связыванием может привести к ошибкам. Возможно, DLL предполагает, что она использует ту же кучу, что и некоторые другие модули в процессе, и это только в том случае, если они все динамически ссылка на ту же DLL-библиотеку времени выполнения C. Хорошо спроектированные библиотеки DLL избегают таких предположений, но вам нужно дважды проверить способ написания библиотеки DLL, чтобы быть уверенным.)

1 голос
/ 25 ноября 2010

"tessdll.dll". Разве это не DLL, которая является частью программного обеспечения Tesseract OCR? Версия для Windows скомпилирована с Visual C ++ 6 и, следовательно, ей нужны эти библиотеки времени выполнения. Ваша версия, кажется, скомпилирована с VC ++ 2008. Если у вас есть версия RAD Studio, вы можете загрузить код и перекомпилировать все это с помощью C ++ Builder, хотя для этого могут потребоваться некоторые корректировки. Более подробная информация о коде также доступна здесь .

1 голос
/ 24 ноября 2010

До установки Visual C ++ я предполагаю, что у вас есть библиотека DLL на вашем компьютере, а установка VC помещает другую копию DLL, возможно, в переменную PATH вашей среды.

Вы пытались поместить tessdll.dll в папку, которая включена в ваш путь поиска? Скажите System32 или в том же каталоге, из которого вы запускаете свой исполняемый файл? Я не знаком с Delphi, поэтому догадываюсь о логике ExtractFilePath

1 голос
/ 24 ноября 2010

Что ж, лучше всего предположить, что для вашей TessDLL.DLL требуется DLL из распространяемого Visual C ++. Если он не может найти данную DLL, он не загружается.

Если я прав в этом, единственный способ, которым он будет работать без него, - это если у вас есть исходный код для TessDLL.DLL и удалены все зависимости от DLL Visual C ++.

Хорошее место, чтобы начать отладку, это на станции, где она действительно работает. Сделайте небольшую тестовую программу, которая загружает DLL. Запустите его в отладчике и посмотрите, какая другая DLL загружается при загрузке вашей DLL. Если вам повезет, то пробник может быть в версии файла ОС, который может распространяться распространяемым MSVC.

0 голосов
/ 24 ноября 2010

У вас есть следующие опции:

  1. Скомпилируйте DLL, не требуя времени выполнения, но помните о проблемах, если у вас есть несколько библиотек DLL, написанных на VC ++ 2008, требующих общего времени выполнения
  2. Установите распространяемый дистрибутив VC ++ 2008, который установит общесистемную доступную среду выполнения
  3. Установите необходимые библиотеки времени выполнения VC + 2008 по тому же пути, что и требуемая библиотека DLL, таким образом, имея «частную» копию этого.

Смотрите здесь: http://msdn.microsoft.com/en-us/library/zebw5zk9(VS.90).aspx

...