Как заставить программу на C ++ искать библиотеки DLL? - PullRequest
0 голосов
/ 30 ноября 2011

Я хочу иметь возможность хранить DLL-файлы в подпапках, чтобы EXE не жаловался на отсутствующую DLL Как мне сделать, чтобы EXE выглядел в подпапке, такой как «DLL»? Если это как-то связано, моя IDE - Code :: Blocks.

Ответы [ 3 ]

2 голосов
/ 30 ноября 2011

Есть способы сделать это с помощью манифестов или перенаправления, но они довольно сложные.

Я бы рекомендовал вместо этого использовать следующую структуру:

myapp.exe
DLLs/
    myapp_internal.exe
    mydll1.dll
    mydll2.dll

В приведенном выше примере ваше реальное приложение - myapp_internal.exe, и оно помещается в подпапку DLL, так что все библиотеки DLL могут быть расположены правильно. Двоичный файл myapp.exe - это просто приложение-заглушка, которое выполняет myapp_internal.exe.

Надеюсь, это поможет!

2 голосов
/ 30 ноября 2011

Сделать эту работу с явной загрузкой (LoadLibrary / GetProcAddress) достаточно просто. Вы управляете процессом связывания и просто передаете полный путь к LoadLibrary.

Для неявной загрузки вы находитесь во власти системы. Хотя вы можете увеличить переменную PATH, это очень драконовское выражение. Столкнувшись с выбором размещения всех DLL вместе с исполняемым файлом или изменением PATH, я бы всегда выбрал первый.

Существует также опция перенаправление DLL , но даже Microsoft, похоже, советует вам размещать свои DLL вместе с исполняемым файлом, а не использовать перенаправление.

0 голосов
/ 30 ноября 2011

Я на самом деле не пробовал это, но нет причин, по которым это не должно работать (знаменитые последние слова).

  1. Включите задержку загрузки для ваших DLL. Это делается с помощью опции компоновщика или компилятора # pragma.
  2. В начале кода (до вызова какой-либо функции DLL) измените копию процесса переменной среды PATH, включив в нее каталог DLL. Это позволит процессу найти DLL, но не повлияет на системную переменную PATH.

Если вы действительно предпочитаете использовать LoadLibrary / GetProcAddress, сделайте себе одолжение и используйте библиотеку-оболочку , чтобы упростить их использование.

...