Как заставить VB6 использовать библиотеки DLL и OCX из каталога приложения? - PullRequest
15 голосов
/ 05 декабря 2008

Я хочу поместить мои зависимые файлы в каталог приложения.

Кажется, я помню, что вы можете заставить VB6 использовать файлы только в локальном каталоге.

Любые намеки?

Ответы [ 5 ]

12 голосов
/ 08 декабря 2008

Вы также можете попробовать настроить Reg-Free COM для вашего проекта. Есть бесплатная программа под названием Make My Manifest , которая сделает большую часть работы за вас

РЕДАКТИРОВАТЬ Веб-сайт MMM не работает. Я вижу здесь , что у автора были проблемы с их хостингом, и он предоставил другое место для получения Make My Manifest - скачайте его здесь

6 голосов
/ 17 января 2009

Размещение библиотек компонентов в папке EXE (с или без файлов .local) также может быть вредным для гигиены целевых машин.

Программы VB6 зарегистрируют компоненты здесь через точку входа саморегуляции за вашей спиной, если они ранее не были зарегистрированы. Затем, если приложение перемещено или удалено, вы оставляете пользователя с нарушенной перерегистрацией - возможно, фатальным для впоследствии установленных приложений, использующих некоторые из тех же компонентов. Это, вероятно, хорошо, хотя для конкретных компонентов приложения, т. Е. Вашей собственной DLL или OCX, которая никогда не понадобится другому приложению.

Уловка .local на самом деле не была предназначена для использования с программами VB6, и, если она используется, ваш установщик должен знать и правильно устанавливать и регистрировать компоненты, если их еще нет на машине. Он предназначен для ручного обхода проблем совместимости версий DLL на отдельных компьютерах, а не для стратегии развертывания.

Перейдите к манифестам приложений и сборок SxS (Reg-Free COM и более) для лучшего решения. Перенаправление DLL / COM (.local) было хорошей попыткой, но у него много бородавок.

6 голосов
/ 09 декабря 2008

Ответ Клэя Никола о порядке поиска не совсем корректен. Этот порядок поиска применяется только к не-COM компонентам. То есть только некоторые библиотеки DLL, а не OCX. Если вы зарегистрируете ваши COM-объекты, они будут использоваться из каталога, в котором они зарегистрированы, независимо от того, что находится в локальном каталоге, , если вы не используете reg-free COM или файл .local.

EDIT:

MakeMyManifest хорошо известен как автоматический инструмент для создания манифестов для проектов VB6, сам не пробовал. DirectCOM также имеет поклонников, опять же, я не пробовал.

РЕДАКТИРОВАТЬ Веб-сайт MMM не работает. Я вижу здесь , что у автора возникли проблемы с их хостингом, и он предоставил другое место для получения Make My Manifest - скачайте его здесь .

Существует полуавтоматическая техника для генерации безрежимных COM-манифестов. Вы можете создавать манифесты с помощью Visual Studio 2008 (вы можете использовать бесплатную версию, такую ​​как Visual Basic Express Edition). Затем внесите несколько правок, чтобы сделать манифесты пригодными для использования с VB6. См. этот раздел этой статьи MSDN для пошаговых инструкций - игнорируйте остальную часть статьи, которая касается ClickOnce.

5 голосов
/ 06 декабря 2008

Это может быть немного запутанным, потому что в каждой версии Windows правила меняются. Старые версии Windows ищут путь до текущего каталога.

Простое решение без манифестов:

Если ваш исполняемый файл A.EXE, добавьте (0-байтовый, пустой) файл в тот же каталог с именем A.EXE.local - для более старых версий Windows это ставит каталог приложения впереди пути в порядке поиска .

5 голосов
/ 06 декабря 2008

Нашел сам:

Windows сначала смотрит в каталог приложений: Если SafeDllSearchMode включен, порядок поиска следующий:

  1. Каталог, из которого загружено приложение.
  2. Системный каталог. Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу.
  3. 16-битный системный каталог. Не существует функции, которая получает путь к этому каталогу, но она ищется.
  4. Каталог Windows. Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу.
  5. Текущий каталог.
  6. Каталоги, перечисленные в переменной среды PATH. Обратите внимание, что сюда не входит путь для каждого приложения, указанный в разделе реестра «Пути к приложениям». Ключ App Paths не используется при вычислении пути поиска DLL.

Если SafeDllSearchMode отключен, порядок поиска следующий:

1. Каталог, из которого загружено приложение. 2. Текущий каталог. 3. Системный каталог. Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу. 4. 16-битный системный каталог. Не существует функции, которая получает путь к этому каталогу, но она ищется. 5. Каталог Windows. Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу. 6. Каталоги, перечисленные в переменной среды PATH. Обратите внимание, что сюда не входит путь для каждого приложения, указанный в разделе реестра «Пути к приложениям». Ключ App Paths не используется при вычислении пути поиска DLL.

в соответствии с: http://msdn.microsoft.com/en-us/library/ms682586.aspx

Но вы можете перенаправить туда, где он ищет .dll, используя Manifest:

http://msdn.microsoft.com/en-us/library/aa375365(VS.85).aspx

...