C ++ DLL в подпапке - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь написать плагин ActiveX и попадаю в тупик при попытке загрузить DLL из подпапок. Я занимаюсь разработкой в ​​Visual Studio 2013 для Windows 10.

Структура библиотек следующая:

myocx.ocx --> this is the compiled result
mylibs/
  mainlib.lib
  maindll.dll
  rest-of-dlls.dll

Я не загружаю библиотеки DLL непосредственно в моем коде, вместо этого они используются библиотекой "mainlib.lib". Я попытался установить в «Дополнительные зависимости» VS Linker путь к файлу mainlib.lib, и он не может зарегистрировать мой плагин. Если я указываю "maindll.dll" в качестве библиотеки отложенной загрузки, то она компилируется, но плагин не работает (в какой-то момент происходит сбой в delayhlp. cpp).

Я прочитал следующие посты :

И следующие документы от Microsoft:

Я пытался добавить путь к библиотекам в переменную среды PATH моей системы, но по какой-то причине это не помогло работать на некоторых ПК.

Я также попробовал способ манифеста (как описано в первом связанном вопросе), но похоже, что VS полностью игнорирует его, так как я могу написать все, что угодно, и он потерпит неудачу, несмотря ни на что.

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

Я не против использовать Dynami c загрузка, но я не знаю, возможно ли это, поскольку библиотеки DLL загружаются не в моем коде, а в файле .lib. Я тоже не против изменить переменную PATH, но, как я уже сказал, в некоторых Windows установках происходит сбой.

Кто-нибудь может пролить свет на это, в дополнение к тому, что написано в связанных сообщениях?

1 Ответ

0 голосов
/ 23 апреля 2020

Немного потянув за волосы, мне удалось решить эту проблему с помощью комбинации указанных выше ссылок.

В Visual Studio я добавил в раздел «Линкер» путь к библиотекам и добавил mainlib .Lib к зависимостям. Затем я добавил maindll.dll в библиотеки DLL с отложенной загрузкой, и в коде (основной класс, сразу после импорта) я добавил следующее:

#pragma comment(lib, "mainlib.lib")

И затем в инициализаторе класса я добавил следующее :

SetDllDirectory("absolute_path_to_my_DLLs_folder")

Тогда плагину .ocx удалось скомпилировать и зарегистрировать с помощью regsvr32, и он не завершился с ошибкой во время выполнения.

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