Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / проброс функций Dll / 15 сообщений из 15, страница 1 из 1
26.05.2006, 21:25
    #33755528
Александр Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
У меня есть
tesk.Dll
tesk.h
tesk.Lib.
полных исходников нет.
Мне нужно написать новую Dll (обертку на старую),
в которой добавятся несколько новых функций и изменяться несколько старых.
Как сделать "проброс" функций из старой Dll в новую (лень все 200 вызовов переписывать)

Я делаю следующее
1.Переименовую старую в
tesk2.Dll
tesk2.h
tesk2.Lib.

2. Создаю новую пустую tesk.Dll
Создал новые, изменил нужные
Вопрос как "прокинуть" оставшиеся не изменяемых 200 штук?
...
Рейтинг: 0 / 0
26.05.2006, 21:51
    #33755554
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
Александр ТретьяковЯ делаю следующее
1.Переименовую старую в
tesk2.Dll
tesk2.h
tesk2.Lib.Переименовывать .h и .lib бессмысленно. Заголовку вообще до лампочки как называться. А библиотеке название файла тоже без разницы, но она хранит внутри себя старое имя dll.

Александр Третьяков2. Создаю новую пустую tesk.Dll
Создал новые, изменил нужные
Вопрос как "прокинуть" оставшиеся не изменяемых 200 штук?
Если ты делаешь новые функции, то хост тоже переписывается? А если он переписывается, то почему-бы не вынести новые и измененые функции в новую dll? Делать враппер над старой dll имеет смысл только только для замены функций и не чтоб не пересобирать хост.

А вообще, чтобы сделать враппер я бы взял Перл и для каждой функции в заголовочном файле сделал бы функцию по следующему шаблону:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
typedef int (*SomeFuncPtr)(int x, int y);
int SomeFunc(int x, int y) {
    HANDLE h=LoadLibrary("old_tesk.dll");
    SomeFuncPtr f = GetProcAddress(h, "SomeFunc");
    int result = f(x,y);
    FreeLibrary(h);
    return f;
}

А вот сделать статичную линковку одноименной функции по моему не получится...
...
Рейтинг: 0 / 0
26.05.2006, 23:10
    #33755606
saint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
а на скорости как оно скажется?
за что люблю .NET, так за то что там нет схожих проблем.
...
Рейтинг: 0 / 0
27.05.2006, 00:00
    #33755645
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
saintа на скорости как оно скажется?
за что люблю .NET, так за то что там нет схожих проблем.Хреново оно скажется на скорости конечно. Лучше всего было бы пересобрать dll-ку, но если хочется извращений - можно и поизвращаться.

А что, в .Net ты можешь решить аналогичную задачу более красиво? :)
...
Рейтинг: 0 / 0
27.05.2006, 02:31
    #33755704
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
Александр ТретьяковКак сделать "проброс" функций из старой Dll в новую (лень все 200 вызовов переписывать)

Придеца. Никуда ниденишся...
...
Рейтинг: 0 / 0
27.05.2006, 12:28
    #33755848
a_s_d
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
библиотеке название файла тоже без разницы, но она хранит внутри себя старое имя dll.
То что она там хранит, мало кого волнует. Загрузчик ориентируется на имя файла.

Есть такая штука как редирект. Это когда функция из одной библиотеки указывает на ф-ию из другой. При этом никакого кода писать вроде не надо, загрузчик сам разберётся. Только как редирект создавать х.з.
...
Рейтинг: 0 / 0
27.05.2006, 12:40
    #33755852
Александр Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
to White Owl
Я так тоже знаю :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
typedef int (*SomeFuncPtr)(int x, int y);
int SomeFunc(int x, int y) {
    HANDLE h=LoadLibrary("old_tesk.dll");
    SomeFuncPtr f = GetProcAddress(h, "SomeFunc");
    int result = f(x,y);
    FreeLibrary(h);
    return f;
}

но переписывать 200 вызовов это не правильно!!!

to a_s_d
Только как редирект создавать х.з.
Это как, тоесть я могу в новой Dll объявить dllexport функции из старой? Как это сделать?
...
Рейтинг: 0 / 0
27.05.2006, 14:12
    #33755905
saint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
>А что, в .Net ты можешь решить аналогичную задачу более красиво? :)
А то.
...
Рейтинг: 0 / 0
27.05.2006, 14:30
    #33755919
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
typedef int (*SomeFuncPtr)(int x, int y);
int SomeFunc(int x, int y) {
    HANDLE h=LoadLibrary("old_tesk.dll");
    SomeFuncPtr f = GetProcAddress(h, "SomeFunc");
    int result = f(x,y);
    FreeLibrary(h);
    return f;
}
так точно писать не стоит
Александр ТретьяковЭто как, тоесть я могу в новой Dll объявить dllexport функции из старой? Как это сделать?попробуй перед функцией написать обе __dllimport __dllexport
...
Рейтинг: 0 / 0
27.05.2006, 15:28
    #33755975
a_s_d
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
Как сделать не знаю. Сейчас с наскока не получилось.
Есть пример редиректа. kernel32.dll экспортирует GetLastError. На месте, где должна быть функция находится такая надпись NTDLL.RtlGetLastWin32Error.

Если в программе вызывать GetLastError, то вызывается RtlGetLastWin32Error из ntdll.dll. При загрузке проги загрузчик обрабатывает редиректы и записывает в таблицу импорта проги реальные адреса.

Применительно к вашему случаю. Допустим есть оригинальная dll и в ней ф-ии f1,f2,f3. допустим вам надо изменить f2 и оставить нейзменными остальные. Вы переименовываете dll-ку(в old.dll), создаёте новую dll со старым именем и новой f2. А старые представляете в виде old.f1...
Как это объяснить компилятору я понятия не представляю, но наверняка должны быть какието опции.
...
Рейтинг: 0 / 0
27.05.2006, 20:27
    #33756222
Александр Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
// переадресация к функции из DllWork

#pragma comment(linker, "/export:SomeFunc=DllWork.SomeOtherFunc")
...
Рейтинг: 0 / 0
30.05.2006, 19:58
    #33761734
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
saint>А что, в .Net ты можешь решить аналогичную задачу более красиво? :)
А то.а пример привести можешь?

Александр Третьяков// переадресация к функции из DllWork
#pragma comment(linker, "/export:SomeFunc=DllWork.SomeOtherFunc")Может и заработает, но это только не для всех компиляторов.

Кстати, можно сделать и вполне универсально. В исходнике для новой dll пишешь:
Код: plaintext
1.
2.
int New_SomeFunction(int x, int y) {
 retrun SomeFunction(x,  y);
};
И линкуешь новую dll с библиотекой на старую dll. А в def файле для новой dll делаешь переименование функций:
Код: plaintext
1.
2.
EXPORT
   SomeFunction = New_SomeFunction
Но тогда никаких __dllexpot() использовать нельзя.
...
Рейтинг: 0 / 0
31.05.2006, 19:55
    #33764526
saint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
>а пример привести можешь?
В .NET можно наследовать от любого обычного класса любой сборки. В данном случае я бы унаследовал от нужного класса и переписал/добавил нужные функции.
...
Рейтинг: 0 / 0
31.05.2006, 22:39
    #33764674
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
saint>а пример привести можешь?
В .NET можно наследовать от любого обычного класса любой сборки. В данном случае я бы унаследовал от нужного класса и переписал/добавил нужные функции.Угу... то есть разницу между подменой внешних библиотек и наследованием не видим...
...
Рейтинг: 0 / 0
01.06.2006, 11:06
    #33765250
saint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проброс функций Dll
хм, а по твоему тут есть принципиальная разница? в каком месте?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / проброс функций Dll / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]