Как вы можете заставить VB6 использовать библиотеки DLL и OCX из каталога приложений?

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

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

Любые подсказки?

Ответы

Ответ 1

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

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

Ответ 2

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

EDIT:

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Нашел сам:

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

  • Каталог, из которого загружено приложение.
  • Системный каталог. Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу.
  • 16-разрядный системный каталог. Нет функции, которая получает путь к этому каталогу, но выполняется поиск.
  • Каталог Windows. Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу.
  • Текущий каталог.
  • Каталоги, перечисленные в переменной среды 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, используя манифест:

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

Ответ 5

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

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

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