2008-12-05 2 views
14

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

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

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

ответ

12

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

EDIT Сайт MMM опущен. Я вижу here, что у автора возникли проблемы с их хостингом и предоставил другое место, чтобы получить Make My Manifest - download it here.

5

Найдено это сам:

Windows, будет выглядеть в каталоге App первых: Если 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 использует манифест:

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

5

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

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

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

+1

Это правильный ответ на Win2k +. Имейте в виду, что если A.EXE имеет встроенный манифест или существует A.EXE.manifest (например, чтобы включить бесплатный COM-код, сделать вашу программу DPI осведомленной и т. Д.), Файл .local игнорируется , поскольку манифестации предназначены для замены технологий. Если это так, в вашем манифесте вы можете просто перечислить файлы, которые вы хотите использовать из своего каталога приложений, чтобы заставить их загружаться оттуда: <имя файла = "my.dll" /> – 2009-04-19 09:26:09

6

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

EDIT:

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

EDIT Сайт MMM не работает. Я вижу here, что у автора возникли проблемы с их хостингом и предоставил другое место, чтобы получить Make My Manifest - download it here.

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

6

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

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

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

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