2014-02-01 5 views
1

Я пытаюсь загрузить DLL (через LoadLibraryA) из другой DLL. Это проблема:LoadLibraryA и относительный путь

c:\**EXE_DIR**\myExe.exe    // this exe load the MY_DLL_N1.dll 
c:\**DLLS_DIR**\MY_DLL_N1.dll // this dll load the MY_DLL_N2.dll 
c:\**DLLS_DIR**\MY_DLL_N2.dll 
  1. Исполняемый файл загрузить MY_DLL_N1.dll ... хорошо.
  2. MY_DLL_N1.dll попытаться загрузить (под кодом) MY_DLL_N2.dll (тот же каталог) ... и вот моя проблема!

int LoadMyDLL() 
{ 
    // ... 

    // same path of the MY_DLL_N1.dll ... right? 
    handle = LoadLibraryA ("MY_DLL_N2.dll"); 

    // ... 
} 

это все .... любая помощь приветствуется!

+3

Вы запрашиваете DLL Hell, ожидая, что Windows найдет для вас нужную DLL. И ты понял. Windows не хочет решительно решить эту проблему. Хранение DLL в том же каталоге, что и EXE, всегда должно быть первым выбором. Умышленное помещение их в другое место, чтобы заставить другую программу использовать одни и те же библиотеки DLL, - худший вид DLL Hell. Вы обновите DLL, чтобы исправить ошибку в одной программе. И вызвать ошибку в другой программе. Не делай этого. –

ответ

1
handle = LoadLibraryA ("MY_DLL_N2.dll"); 

Поскольку вы не задаете путь, используется DLL search order. Это будет выглядеть в каталоге исполняемого файла, но не будет искать в каталогах загружаемых DLLS. Следовательно, не удается найти DLL.

У вас есть несколько вариантов:

  1. Поместить все DLLS в том же каталоге, что и исполняемый файл.
  2. Передайте полный путь к DLL при вызове LoadLibrary.
  3. Позвоните SetDllDirectory, чтобы добавить каталог DLL в путь поиска. Выполните этот вызов из исполняемого файла перед загрузкой первой библиотеки DLL. После этого вам не нужно будет использовать полный путь при загрузке первой библиотеки DLL.

Если вам не нужно распространять DLLS между различными приложениями, всегда предпочтительнее вариант 1. Это позволяет вам быть уверенным, что загружаемые DLL-файлы являются правильными. Это потому, что исполняемый каталог всегда ищет первый.

4

Все, что вам нужно знать, находится здесь: Dynamic-Link Library Search Order.

Рассмотрите возможность использования SetDllDirectory, чтобы добавить путь к DLL в путь поиска LoadLibrary.

+0

Каким будет AppPath? Насколько я знаю, они не влияют на поиск DLL. Я ошибаюсь? –

+0

@DavidHeffernan - вы правы. Ответ отрегулирован. – selbie

+1

Другим вариантом является использование 'GetModuleFileName()', чтобы получить полный путь, из которого MY_DLL_N1.dll был загружен, замените имя файла с помощью MY_DLL_N2.dll и передайте новый полный путь в 'LoadLibrary()'. Тогда вам не нужно беспокоиться о пути поиска вообще. –

Смежные вопросы