Подправить имя модуля DLL во время LoadLibrary

Я хочу загрузить во время выполнения сторонний двоичный плагин (P.dll) в свое приложение (A.exe). Этот подключаемый модуль был создан для другого приложения (B.exe).

Плагин имеет неявный импорт dll в модуль B.exe, например:

  • Имя модуля: B.exe
  • функция1
  • функция2
  • func3

Я экспортировал функции func1, func2 и func3 из A.exe, но не могу загрузить dll с помощью LoadLibrary, потому что нет модуля с именем «B.exe».

Есть ли что-нибудь лучше, чем переименовать мое приложение в «B.exe» или исправить PE P.dll?

Спасибо,

Кирилл


person Hulud    schedule 17.11.2011    source источник
comment
Это очень необычно, перепроверьте с помощью dumpbin.exe /imports. Ты сильно застрял, если это правда.   -  person Hans Passant    schedule 17.11.2011
comment
Как именно P.dll относится к B.exe? Мне кажется странным, что dll ссылается на exe по имени. B.exe предназначен для использования P.dll, а не наоборот...   -  person kol    schedule 17.11.2011
comment
Что произойдет, если вы переименуете A.exe в B.exe? Может ли он действительно загрузить P.dll?   -  person kol    schedule 17.11.2011
comment
Ганс: я только что перепроверил с помощью dumpbin, и да, dll имеет неявный импорт в exe.   -  person Hulud    schedule 17.11.2011
comment
Кол: можно экспортировать символы из exe. Вы даже можете создать файл .lib.   -  person Hulud    schedule 17.11.2011
comment
Кол: да, если я его переименую, он сработает.   -  person Hulud    schedule 17.11.2011
comment
Переименование вашего приложения — единственный поддерживаемый механизм.   -  person Raymond Chen    schedule 17.11.2011
comment
Ничего себе, эта проблема действительно заслужила тег dll-hell.   -  person thiton    schedule 17.11.2011


Ответы (1)


Вы можете создать поддельный B.exe (на самом деле это может быть DLL) и перенаправить экспорт B.exe в A.exe .

Перенаправление может быть выполнено путем переадресации экспорта, см. раздел «Переадресация экспорта» здесь .

person Abyx    schedule 02.12.2011
comment
Добавьте DLL с именем B.dll — может быть скомпилирована из файла модуля, код не требуется. Определите перенаправления с помощью файла модуля, чтобы перенаправить импорт в A.exe. Переименуйте B.DLL в B.EXE. В A.exe загрузите B.EXE, используя LoadLibrary(). Затем загрузите P.dll, и импорт должен разрешиться. Это работает, потому что библиотеки DLL не должны называться *.dll, они могут называться как угодно. - person Ben; 09.01.2012