Реэкспорт функций DLL
От: _Dinosaur Россия  
Дата: 15.10.02 12:39
Оценка:
Здравствуйте!
Ситуация следующая:
есть:
A.DLL, экспортирующая около 500 символов (функции и переменные)
нужно:
написать обертку для A.DLL
предполагаемое решение:
создать B.DLL, реализовать в ней часть функций из A.DLL, на остальные символы сделать форвардинг
вопрос:
Подскажите, пожалуйста, можно ли средствами MS VC сделать это, либо нужно писать свою прогу на подобие линкера
Завидую людям, которые могут себе позволить никуда не спешить.
Re: Реэкспорт функций DLL
От: DIXX  
Дата: 15.10.02 14:04
Оценка:
Здравствуйте _Dinosaur, Вы писали:

D>Здравствуйте!

D>Ситуация следующая:
D>есть:
D>A.DLL, экспортирующая около 500 символов (функции и переменные)
D>нужно:
D>написать обертку для A.DLL
D>предполагаемое решение:
D>создать B.DLL, реализовать в ней часть функций из A.DLL, на остальные символы сделать форвардинг
D>вопрос:
D>Подскажите, пожалуйста, можно ли средствами MS VC сделать это, либо нужно писать свою прогу на подобие линкера

В любом случае нужно точки входа в DLL прописать такие же..
Чтобы при загрузке таблица импорта такаже как и для старой DLL сформировалась. Я вот не очень представляю что имеется в виду под прогой наподобие линкера. Ведь по объявленным в длл символам формируется таблица импорта.. Она заполняется при загрузке, когда длл уже загружена в адресное простраство процесса, просто проставляются адреса откуда вызывать функции, а пока ничего не загружено соответственно и адреса неизвестны. Поэтому если не хочется менять все функции, единственный способ это подгрузить нашу новую длл в процесс и подменть адреса символов в таблице.
Re: Реэкспорт функций DLL
От: Dima2  
Дата: 15.10.02 14:08
Оценка:
Здравствуйте _Dinosaur, Вы писали:

есть какая-то директива линкеру, что данную ф-ю надо реэкспортировать из другой dll (поройся в MSDN или посморти у Рихтера). Тогда просто в своей dll пишеш имя этой ф-ии и dll из которой она экспортируется.
Re[2]: Реэкспорт функций DLL
От: _Dinosaur Россия  
Дата: 15.10.02 14:23
Оценка:
Здравствуйте DIXX, Вы писали:

DIX>Здравствуйте _Dinosaur, Вы писали:


DIX>В любом случае нужно точки входа в DLL прописать такие же..

DIX>Чтобы при загрузке таблица импорта такаже как и для старой DLL сформировалась. Я вот не очень представляю что имеется в виду под прогой наподобие линкера.

прога: на вход подаются исходная DLL и DLL с перехваченными функциями, на выходе DLL — обертка

DIX>Ведь по объявленным в длл символам формируется таблица импорта.. Она заполняется при загрузке, когда длл уже загружена в адресное простраство процесса, просто проставляются адреса откуда вызывать функции, а пока ничего не загружено соответственно и адреса неизвестны. Поэтому если не хочется менять все функции, единственный способ это подгрузить нашу новую длл в процесс и подменть адреса символов в таблице.


А если винда rebasing DLL-ки сделает?
Завидую людям, которые могут себе позволить никуда не спешить.
Re[2]: Пока не нашел
От: _Dinosaur Россия  
Дата: 15.10.02 14:37
Оценка:
Копался с неделю
Завидую людям, которые могут себе позволить никуда не спешить.
Реэкспорт функций Dll
От: Alex Fedotov США  
Дата: 15.10.02 17:03
Оценка: 37 (5)
#Имя: FAQ.dll.reexport
_D>Здравствуйте!
_D>Ситуация следующая:
_D>есть:
_D>A.DLL, экспортирующая около 500 символов (функции и переменные)
_D>нужно:
_D>написать обертку для A.DLL
_D>предполагаемое решение:
_D>создать B.DLL, реализовать в ней часть функций из A.DLL, на остальные символы сделать форвардинг
_D>вопрос:
_D>Подскажите, пожалуйста, можно ли средствами MS VC сделать это, либо нужно писать свою прогу на подобие линкера :( :???:

В def-файле пишешь нечто вроде этого:

EXPORTS
    SetLastError = kernel32.SetLastError


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

То же самое можно сделать и через директиву /export

#pragma comment(linker, "/export:SetLastError=kernet32.SetLastError")
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.