2013-07-02 4 views
5

Я новичок в «скрытых/темных мест» в C++ и мне было интересно, как загрузить DLL-файл из другой директории или поддиректории внутри одной, где мой текущий исполняемый работаетC++ Загрузить DLL из подкаталога?

Ex :

./MyAppDirectory 
    /MyApp.exe 
    /SomeDLL.dll 
    /AnotherDLL.dll 
    /SubDirectory 
    /SomeDLL2.dll 
    /AnotherDLL2.dll 
    /YetAnotherDLL.dll 
    /... 

Так «MyApp.exe» автоматически загружает «SomeDLL.dll» и «AnotherDLL.dll» от его корневой папки «MyAppDirectory», однако я также хочу, чтобы иметь возможность загружать «SomeDLL2.dll», " AnotherDLL2.dll "," YetAnotherDLL.dll "и т. Д. Из папки" SubDirectory "внутри папки" MyAppDirectory ".

Я делал некоторые поиски и от того, что я нашел только решения:

  • 1) Изменение рабочего каталога исполняемого файла.
  • 2) Поместите DLL-файлы в корень Windows.
  • 3) Измените переменную среды PATH.

Но все они имеют некоторые плохие стороны (не стоит упоминать здесь), и это не то, что мне действительно нужно. Еще одно решение - «Конкретные пути приложения!». который включает работу с реестром Windows и кажется немного лучше, чем те, о которых говорилось ранее.

Однако мне нужно иметь возможность сделать это внутри «MyApp.exe» с помощью C++ без использования внешних методов.

Я использую MinGW 4.7.2, а моя IDE - код :: Blocks 12.11 также моя ОС - Windows XP SP3 Pro x86.

Любая ссылка, учебник, документация, пример и т.д. принимается и спасибо за ваше время: D

+0

Все три из ваших подробных списков - плохие идеи. Не делайте этого. –

+0

Возможный дубликат [Изменение пути поиска DLL для статической связанной DLL] (http://stackoverflow.com/questions/3832290/altering-dll-search-path-for-static-linked-dll) – MSalters

ответ

2

Если вы явно не загружая DLL («вручную», в коде с помощью LoadLibrary(...)), то вы должны иметь .dll в месте, которое для Windows будет искать DLL файлы, whihc довольно много значит один из трех вариантов, о которых вы говорите в своем вопросе.

При использовании LoadLibrary вы можете указать относительный или абсолютный путь к DLL.

Обратите внимание, что это совершенно другой, чтобы загрузить DLL файлы явно и неявно - в явном случае, вы должны использовать LoadLibrary, а затем использовать GetProcAddress, чтобы найти адрес функции, и вы должны будете использовать указатели на функции для вызова функции - это обычно используется только для плагинов или аналогичных функций, где DLL предоставляет небольшое количество функций (нередко просто фабричную функцию для создания объектов для выполнения чего-то, что имеет общий класс интерфейса, и каждая DLL имеет тот же тип функции, чтобы создать объект, чтобы делать то, что он должен делать).

В неявной нагрузке вам не нужно ничего делать в своем коде, чтобы использовать DLL, а функции из DLL просто выглядят так, как если бы они были жестко связаны с приложением.

+0

Большое спасибо за расширенный ответ, который ответил на мой вопрос: D –

+0

Если это ответит на ваш вопрос, пожалуйста, отметьте его как таковой. –

+0

Извините за ошибку. Я был отвлечен кем-то, документируя дальнейший ответ и забыл подтвердить. –

0

Вы должны использовать

LoadLibrary("subFolder\\dynamicLibrary.dll"); 

Это явная ссылка на DLL, это немного сложнее, чем неявное связывание (что я думаю, что это то, что вы используете), но я считаю, что это правильный путь для достижения вашей цели

explicit

implicit

+0

Этот метод специфичен для MSVC или я могу использовать его в других компиляторах, таких как MinGW (gcc)? –

+0

Это WinAPI, поэтому вы можете использовать в каждом компиляторе, вам просто нужно включить и ссылку Kernel32.lib Очевидно, что он работает только в Windows –

+0

Нет. Вы должны использовать абсолютный путь. –

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