Я могу использовать две несовместимых версии того же DLL в том же процессе?

Ответ очень прост: используйте логический флаг, чтобы различать, когда запускать «красный флаг», а когда зеленый.

11
задан Community 23 May 2017 в 12:01
поделиться

5 ответов

Поскольку Вы не используете VendorLibUtils непосредственно, я предполагаю, что Вы не можете использовать LoadLibrary и т.д.

Если VendorLibUtils DLLs только имеет экспорт ординалом, Вы могли бы, вероятно, переименовать один из библиотеки и исправить соответствующий VendorLibX для использования другого имени файла для его импорта.

Если VendorLibUtils DLLs имеет один или несколько экспортируемых символов с теми же именами, Вы, возможно, должны были бы исправить импорт и таблицы экспорта также, но давайте надеяться нет!:-)

3
ответ дан 3 December 2019 в 07:14
поделиться

Вы имеете в виду, у Вас есть ситуация, подобная MSVCRT80.DLL и MSVCRT90.DLL? Существует серьезное основание, Microsoft пронумеровала эти DLLs. Если бы обоих назвали MSVCRT.DLL, то только один из них был бы загружен в единственном процессе.

1
ответ дан 3 December 2019 в 07:14
поделиться

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

HMODULE v1 = LoadLibrary(_T("libv1_0.dll"));
libv1_0::fun_in_lib = reinterpret_cast<FUNTYPE>(GetProcAddress(v1, _T("fun_in_lib"));

и

HMODULE v2 = LoadLibrary(_T("libv2_0.dll"));
libv2_0::fun_in_lib = reinterpret_cast<FUNTYPE>(GetProcAddress(v2, _T("fun_in_lib"));

Работало ли это или не все еще отчасти зависит от библиотеки, таким образом, она может или не может работать, но насколько я могу сказать, что это - единственная возможность.

2
ответ дан 3 December 2019 в 07:14
поделиться

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

Вы не можете только поместить DLLs в различные каталоги. После того как DLL с именем загружается, все другие попытки загрузить другой DLL тем же именем модуля будут просто использовать то, которое это уже загружается, даже если пути отличаются.

От этого мы можем прийти к заключению, что для загрузки двух копий VendorLibUtils одна копия должна иметь другое имя. Вы не можете только переименовать файл DLL; код в Вашей программе не будет знать для поиска другого файла. Поэтому, возможно, существует способ отредактировать таблицу импорта VendorLibB, чтобы заставить его думать функции, в которых это нуждается, находятся в VendorLibUtilsB.dll вместо просто VendorLibUtils.dll. Я боюсь, что не знаю ни о какой утилите, которая сделает это, но у меня есть мало сомнения, которое возможно сделать.

5
ответ дан 3 December 2019 в 07:14
поделиться

Как кто-то еще упомянул, Вы могли переименовать одну из копий VendorLibUtils и изменить таблицу импорта связанного VendorLib DLL для соединения с ним, а не VendorLibUtils.dll, с которым это было создано.

Существует несколько инструментов там, которые позволяют Вам отредактировать файлы EXE/DLL таким образом. Проводник CFF является довольно достойным, который позволяет редактировать таблицы импорта. Если Вы откроете VendorLib DLL в нем и перейдете к разделу Import Directory (в дереве слева), то Вы будете видеть список модулей наверху главного окна. Можно переименовать модуль путем двойного щелчка по его имени. Затем Вы просто сохраняете DLL, и он должен теперь использовать Ваш переименованный VendorLibUtils DLL.

Конечно, это предполагает, что VendorLib использует таблицу импорта для доступа к VendorLibUtils, который он не может - он может использовать LoadLibrary/GetProcAddress, в этом случае Вы не будете видеть запись таблицы импорта для VendorLibUtils.

На самом деле, если VendorLib действительно использует таблицу импорта, но также и использование LoadLibrary для доступа к VendorLibUtils DLL в некоторых местах (я видел сделанный) те места будут все еще использовать неправильное. При переименовании обеих библиотек Вы могли бы, по крайней мере, видеть ошибку, если это верно (так как DLL с настоящим именем не будет существовать теперь). Существует способ иметь дело с этим, если он происходит, но он начинает становиться довольно сложным в этой точке, таким образом, я не уточню, если Вы действительно не будете хотеть/нуждаться знать.

2
ответ дан 3 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: