Загрузка 2 DLL с одинаковым именем, но разным содержимым - PullRequest
0 голосов
/ 04 июля 2019

У меня есть приложение для Windows C++, которое встроено в плагин Excel. Мое приложение связывается с клиентом oracle 12 через OCCI (https://www.oracle.com/database/technologies/appdev/oci.html).

Во время выполнения программа задержит загрузку Oracle dll’s, например ocil.dll, oraons.dll, OraOCIEI12.dll. Обратите внимание, что библиотеки DLL установлены на задержку загрузки, потому что они хранятся на файловом сервере (не задано в пользовательской переменной windows PATH), и в первую очередь программа устанавливает это местоположение.

У нас есть пользователи, которые комбинируют наш плагин Excel со своим собственным VBA кодом, который использует oracle ODBC driver. Проблема в том, что ни один из наших пользователей не установил oracle 12 client на своих компьютерах. Вместо этого они работают на клиенте oracle 11 и не могут обновляться.

У Oracle нет имен версий в их именах; клиенты oracle 11 и 12 зависят от oci.dll, oraons.dll и т. д. DLL зависят от версии, а их имена - нет.

Существует два вида аварий:

  1. Сначала пользователь вызывает что-то через нашу библиотеку, а затем через внешний код VBA. Что происходит, так это то, что оракулы 12 dll загружаются первыми. Наша библиотека работает нормально, но код VBA дает сбой, поскольку она пытается использовать библиотеки oracle 12.
  2. Сначала пользователь вызывает код VBA, а затем нашу библиотеку. Код VBA загружает Oracle 11 DLL и работает нормально, но наша библиотека вылетает.

Наше приложение ссылается на библиотеки SDK, загруженные с: https://www.oracle.com/technetwork/topics/winsoft-085727.html (Instantclient-sdk-nt-12.2.0.1.0.zip) Наше приложение должно ссылаться на оракул 12, так как мы компилируем с Visual Studio 2017 и компилятором MSCV 14.14.

Можно ли как-то заставить работать оба клиента оракула?

Я посмотрел файлы заголовков оракула, и там ничего не указывает имена библиотек, которые нужно загрузить. Наше приложение ссылается на oci.lib, и там я вижу несколько случаев “OCI.dll”. Возможно, я мог бы заменить их на “OCI12.dll”?

Я также нашел эту страницу:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/b3eaa07f-7f92-4693-8aa1-b8fee0b92d2f/cannot-load-2-dlls-with-same-name-but-different-versions

Я попробовал это. Когда я делаю явное LoadLibraryA("oci.dll"), я вижу в отладчике, что загружаю тот, который я установил с манифестом. Однако, когда я затем выполняю реальный вызов функции, в котором используется oracle, он загружает Ohter OCI.dll (на нашем файловом сервере) вместе с 3 другими dracle-файлами: oraocci12d.dll, OraOCIEi12,dll and oraons.dll. Может быть, это как-то связано с тем, как оракул загружает DLL?

Для полноты пользователь делает что-то подобное в своем коде VBA:

Dim cnnPointer As ADODB.Connection
cnnPointer.ConnectionString = "DRIVER={Oracle in 112};" _
                            & "DBQ=" & Me.txtMiljoe.Text & ";" _
                            & "UID=" & Me.txtUser.Text & ";" _
                            & "PWD=" & Me.txtPassword.Text & ";"

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

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