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

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

2. Создаю новую пустую tesk.Dll
Создал новые, изменил нужные
Вопрос как "прокинуть" оставшиеся не изменяемых 200 штук?
...
Рейтинг: 0 / 0
проброс функций Dll
    #33755554
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ТретьяковЯ делаю следующее
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
проброс функций Dll
    #33755606
saint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а на скорости как оно скажется?
за что люблю .NET, так за то что там нет схожих проблем.
...
Рейтинг: 0 / 0
проброс функций Dll
    #33755645
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saintа на скорости как оно скажется?
за что люблю .NET, так за то что там нет схожих проблем.Хреново оно скажется на скорости конечно. Лучше всего было бы пересобрать dll-ку, но если хочется извращений - можно и поизвращаться.

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

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

Есть такая штука как редирект. Это когда функция из одной библиотеки указывает на ф-ию из другой. При этом никакого кода писать вроде не надо, загрузчик сам разберётся. Только как редирект создавать х.з.
...
Рейтинг: 0 / 0
проброс функций Dll
    #33755852
Александр Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
проброс функций Dll
    #33755905
saint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А что, в .Net ты можешь решить аналогичную задачу более красиво? :)
А то.
...
Рейтинг: 0 / 0
проброс функций Dll
    #33755919
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
проброс функций Dll
    #33755975
a_s_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как сделать не знаю. Сейчас с наскока не получилось.
Есть пример редиректа. kernel32.dll экспортирует GetLastError. На месте, где должна быть функция находится такая надпись NTDLL.RtlGetLastWin32Error.

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

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

#pragma comment(linker, "/export:SomeFunc=DllWork.SomeOtherFunc")
...
Рейтинг: 0 / 0
проброс функций Dll
    #33761734
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
проброс функций Dll
    #33764526
saint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>а пример привести можешь?
В .NET можно наследовать от любого обычного класса любой сборки. В данном случае я бы унаследовал от нужного класса и переписал/добавил нужные функции.
...
Рейтинг: 0 / 0
проброс функций Dll
    #33764674
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
saint>а пример привести можешь?
В .NET можно наследовать от любого обычного класса любой сборки. В данном случае я бы унаследовал от нужного класса и переписал/добавил нужные функции.Угу... то есть разницу между подменой внешних библиотек и наследованием не видим...
...
Рейтинг: 0 / 0
проброс функций Dll
    #33765250
saint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм, а по твоему тут есть принципиальная разница? в каком месте?
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / проброс функций Dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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