2012-02-16 3 views
3

Скажем, у меня есть это в верхней части модуля:Где должна располагаться внешняя DLL?

Public Declare Function getCustomerDetails Lib "CustomerFunctions"() As Long 

Если я бегу программу из VB6 IDE, где должен быть расположен CustomerFunctions.dll?

Если я запускаю исполняемый файл программы, где должен находиться CustomerFunctions.dll?

+0

В большинстве случаев dll размещаются в папке Systems .. C:/Windows/System32 например .. и зарегистрированы в реестре. также проверьте свои ссылки .. –

+0

@PhilipBadilla: это третья сторона DLL. – CJ7

+0

Да, но вы тот, кто ссылался на него? –

ответ

3

При загрузке стандартной DLL (а не ActiveX или COM-dll) Windows применяет следующие правила;

Если SafeDllSearchMode включен:

  1. каталога программы.
  2. Системный каталог. Либо (Windows \ System32, либо Windows \ SysWow64 в зависимости от того, работаете ли вы на 64 бит или нет).
  3. 16-разрядный системный каталог (Windows \ System).
  4. Каталог Windows.
  5. Текущий каталог.
  6. Все каталоги, которые в переменной среды PATH.

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

  1. Каталог программы.
  2. Текущий каталог.
  3. Системный каталог. Либо (Windows \ System32, либо Windows \ SysWow64 в зависимости от того, работаете ли вы на 64 бит или нет).
  4. 16-разрядный системный каталог (Windows \ System).
  5. Каталог Windows.
  6. Все каталоги, которые в переменной среды PATH.

Мое личное предпочтение (а не мусор в каталоге System или Windows) заключается в том, чтобы создать каталог developmentDLLs где-нибудь и добавить его в переменную PATH. При распространении приложения поместите DLL в каталог приложения программы. Таким образом, у вас есть меньше шансов вмешиваться в другие DLL. Для получения полной информации о загрузке DLL см. MSDN.

+0

+1. Неплотная идея иметь DLL-каталог на пути к вашей разработке pc – MarkJ

+0

Исполняемый файл может использовать манифест для указания контекста активации даже для стандартных DLL, например. '' будет инструктировать 'LoadLibraryExW' для поиска' CustomerFunctions.dll' только в подпапке 'External' в основной исполняемой папке. Кроме того, если имя файла содержит (неполный) путь, поиск не выполняется с помощью 'LoadLibrary', а просто терпит неудачу. – wqw

2

Поскольку это не ActiveX DLL, применяются несколько иные правила.

  • При работе в среде IDE вы можете поместить его в любом c:\windows\system32 или в каталоге, из которого VB6 выполняется (например, c:\program files\microsoft visual studio...).
  • При запуске исполняемой программы вне VB6 вы можете поместить DLL в c:\windows\system32 или в каталог приложения.

Имейте в виду, что я дал вам технический ответ (например, поместив файл в c:\windows\system32), который будет работать. Тем не менее, тенденция последнего десятилетия заключалась в том, чтобы изолировать необходимые компоненты в каталоге приложений.

+0

Я думаю, что «десятилетие» - это консервативная оценка ... Windows XP уже более десяти лет, и было «модно» не засорять системные папки задолго до XP. –

+0

+1 Суть в том, что при работе в среде VB6 IDE она не найдет DLL в «каталоге приложений» - каталоге, содержащем VBP. – MarkJ