Вопрос о зависимости DLL / SetDLLDirectory - PullRequest
2 голосов
/ 19 января 2011

У меня следующая ситуация, и я не могу найти хорошего решения.

У меня установлено приложение C ++ (app.exe), установленное в C: \ ProgFiles \ MyApp.Для этого нужна куча библиотек DLL, которые я устанавливаю в C: \ ProgFiles \ MyApp \ bin.Я хотел бы поместить их в подпапку, потому что их так много.

Теперь, когда я запускаю app.exe, нужно что-то сообщить Windows, где находятся необходимые библиотеки DLL.В прошлом я использовал для этого переменную среды PATH, но я больше не могу этого делать, потому что я создам другое приложение с отдельным установщиком, который использует многие библиотеки DLL с одинаковыми именами.

Я думал о вызове SetDLLDirectory в начале приложения - но я забыл, что из-за того, что отсутствуют необходимые библиотеки DLL, перед тем, как туда попасть, происходит сбой.

Есть предложения?

Ответы [ 4 ]

4 голосов
/ 20 января 2011

Использование опции delay load в сочетании с SetDLLDirectory может работать.DLL с задержкой загрузки динамически загружается системой при первом обращении.Если вы используете Visual Studio, вы можете указать, какие библиотеки DLL следует загружать с задержкой в ​​свойствах проекта в параметрах ввода компоновщика.Существует поле Delay Loaded DLLs для их указания.В противном случае вы можете указать /DELAYLOAD:mydll.dll в команде компоновщика.

4 голосов
/ 20 января 2011

См. эту статью от Microsoft, в которой обсуждается путь поиска в DLL и связанные с этим проблемы.

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

Одним из решений будет использование LoadLibrary (с полным путем), затем GetProcAddress.Это было бы болезненно.

Ни один нормальный пользователь не будет копаться в C:\Program Files\YourApp, и именно туда вы должны их положить, если у вас нет веских причин не делать этого.

2 голосов
/ 20 января 2011

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

Если вы полагаетесь на PATH, то вы всегда будете зависеть от того, что пользователь облажает его и приводит к дополнительным расходам на поддержку, без всякой уважительной причины.

0 голосов
/ 19 мая 2015

одним из решений проблемы будет использование функции SetDllDirectory; но это должно быть первым делом, которое вы выполняете в своей программе (что трудно сделать), мое решение состоит в том, чтобы использовать стороннюю программу для установки каталога dll, а затем вызывать ваш EXE-файл как новый процесс:

Это третье лицо, которое будет EXE-файлом:

#include <windows.h>

SetDllDirectory(_T(".dll location"));   

STARTUPINFOW siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
siStartupInfo.cb = sizeof(siStartupInfo);

if (CreateProcessW(L".exe location",NULL, NULL, NULL, FALSE,
    0, NULL, NULL,
    &siStartupInfo, &piProcessInfo))
{
    /* This line waits for the process to finish. */
    /* You can omit it to keep going whilst the other process runs */
    //dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait * 1000));
}
else
{
    /* CreateProcess failed */
    //iReturnVal = GetLastError();
}
return 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...