C++ с Visual Studio 2017 — управление порядком поиска в библиотеке при динамической компоновке во время загрузки

У меня есть приложение C++ для Windows, скомпилированное с помощью MSVC, которое во время выполнения связывается с несколькими DLL. Приложение имеет внешний интерфейс Excel: файл .xll, который пользователь может загрузить в Excel. Пользователь должен иметь возможность загрузить xll из любого места.

Все dll расположены на общем диске, и ни один из пользователей не добавил это местоположение в свою переменную пути Windows (мне бы этого не хотелось, поскольку эти dll могут конфликтовать с другими программами). Я сделал приложение таким, что при запуске приложения переменная пути Windows изменяется локально (только в сеансе, в котором работает приложение), чтобы включить путь к этим dll.

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

Вот моя проблема: я хочу использовать boost-python для внешнего интерфейса Python. Boost python заставляет мое приложение загружать python27.dll при запуске приложения (связывание во время загрузки), т.е. без задержки.

На самом деле я попытался связать с задержкой и получил следующую ошибку: 1> ССЫЛКА: фатальная ошибка LNK1194: невозможно отложить загрузку «python27.dll» из-за импорта символа данных «__imp___Py_NoneStruct»; ссылка без /DELAYLOAD:python27.dll

Мой вопрос заключается в том, могу ли я каким-то образом изменить путь поиска во время загрузки из своего приложения?

Обратите внимание, что все те пользователи, которые используют внешний интерфейс Excel, не собираются использовать внешний интерфейс python (который предназначен для другой группы пользователей), поэтому я не могу быть уверен, что у этих пользователей Excel установлен python, особенно не версия 2.7.

Заранее большое спасибо, Неле.


person Nele    schedule 20.12.2018    source источник
comment
Как и в случае с ответом Роба К.: это именно то, что может сделать для вас программа запуска. Либо пакетный файл, либо другой исполняемый файл, который просто устанавливает правильную среду для выполнения, а затем запускает процесс, выполняющий фактический исполняемый файл. Вы даже можете упаковать свое исполняемое приложение в загружаемую с задержкой dll, которую вы загружаете в свою программу запуска после того, как вы изменили среду...   -  person BeyelerStudios    schedule 20.12.2018
comment
почему бы не скомпилировать версию без Python для тех, кто использует Excel? так как похоже, что это не проблема для пользователей Python, как сказал ваш последний абзац.   -  person apple apple    schedule 20.12.2018
comment
Большое спасибо за ваши комментарии. Там был какой-то старый код, из-за которого в компиляции excel понадобился python. Я удалил это, и теперь мой плагин Excel больше не зависит от python27.dll.   -  person Nele    schedule 21.12.2018


Ответы (1)


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

person Rob K    schedule 20.12.2018
comment
Привет, Роб, на самом деле я пытался установить путь к dll в Linker->General->Additional Library Directory проекта приложения, но это не работает (это работает для файлов .lib). Есть ли другой способ? - person Nele; 20.12.2018
comment
Я не уверен, что это сработает, но в настройках отложенной загрузки DLL укажите полный путь к Dll, а не только имя файла Dll. В моих проектах, где я хотел условно загрузить Dll, я написал базовый класс, который заключал LoadLibrary() в конструктор, FreeLibrary() в деструктор и имел функции для поиска адресов функций по имени или порядковому номеру. Я получил классы от этого для каждой из библиотек DLL, которые я хотел динамически загружать. - person Rob K; 20.12.2018
comment
Еще одна вещь, которую вы можете рассмотреть, это написание собственной вспомогательной функции отложенной загрузки - person Rob K; 20.12.2018
comment
Привет, Роб, загрузка с задержкой работает нормально (к тому времени, когда необходимо выполнить загрузку с задержкой, путь уже включает расположение dll. Моя проблема заключалась в том, что я не мог отложить загрузку python. В конце концов, Я удалил старый код, который создавал зависимость от Python для плагина Excel, теперь все работает нормально. - person Nele; 21.12.2018