Определение адреса функции в DLL
От: wbear  
Дата: 06.03.21 11:51
Оценка: :)
Всем привет

Возникла задача использовать чужую библиотеку в своем проекте. Библиотека представляет собой DLL c набором экспортируемых наружу функций.

Нашли функцию с которой начинается инициализация библиотеки.

Однако судя по коду экспортируемые функции являются функциями класса.

Такой вывод я сделал на основании имени экспортируемой функции — ?Instance@Server@@SAPAV1@XZ (Server::Instance)

Так как я использую dll мне нужно как-то определить адрес этой функции в dll. Как это сделать?

Делаю как то так, но выдает ошибку.



typedef AServer* (Server::*InstanceProc)()

hDll = LoadLibrary("server.dll");

Server::*InstanceProc p = (Server::*InstanceProc)GetProcAddress(hDll, "Instance");

AServer *pSer;
pSer = p->Instance();
Отредактировано 06.03.2021 12:14 wbear . Предыдущая версия . Еще …
Отредактировано 06.03.2021 12:12 wbear . Предыдущая версия .
Отредактировано 06.03.2021 11:58 wbear . Предыдущая версия .
Re: Определение адреса функции в DLL
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 06.03.21 12:09
Оценка:
Здравствуйте, wbear, Вы писали:

W>Server::*InstanceProc p = (Server::*InstanceProc)GetProcAddress(hDll, "");


Вы пытаетесь получить адрес функции, не указывая ее имени, и после этого удивляетесь?
Re[2]: Определение адреса функции в DLL
От: wbear  
Дата: 06.03.21 12:13
Оценка: -1
Прошу прощение, случилась очепятка

ЕМ>Вы пытаетесь получить адрес функции, не указывая ее имени, и после этого удивляетесь?


Server::*InstanceProc p = (Server::*InstanceProc)GetProcAddress(hDll, "Instance");
Re[3]: Определение адреса функции в DLL
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 06.03.21 12:43
Оценка:
Здравствуйте, wbear, Вы писали:

W>Прошу прощение, случилась очепятка

W>Server::*InstanceProc p = (Server::*InstanceProc)GetProcAddress(hDll, "Instance");

Такое впечатление, что Вы решили наугад перебрать все, что приходит в голову, не понимая, что именно делаете.

Если функция, по Вашим же словам, называется "?Instance@Server@@SAPAV1@XZ", то с чего вдруг Вы пытаетесь найти ее по имени "Instance"?
Re: Определение адреса функции в DLL
От: bnk СССР http://unmanagedvisio.com/
Дата: 06.03.21 13:26
Оценка: +2
Здравствуйте, wbear, Вы писали:

W>Возникла задача использовать чужую библиотеку в своем проекте. Библиотека представляет собой DLL c набором экспортируемых наружу функций.


Обычно если библиотека предназначена для внешнего использования, у нее, кроме DLL, есть еще .H и .LIB файлы (SDK), для использования разработчиками.
Re[4]: Определение адреса функции в DLL
От: wbear  
Дата: 11.03.21 09:28
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>Такое впечатление, что Вы решили наугад перебрать все, что приходит в голову, не понимая, что именно делаете.


ЕМ>Если функция, по Вашим же словам, называется "?Instance@Server@@SAPAV1@XZ", то с чего вдруг Вы пытаетесь найти ее по имени "Instance"?

Спасибо на наводку с именем.
Re[2]: Определение адреса функции в DLL
От: wbear  
Дата: 11.03.21 09:29
Оценка:
Здравствуйте, bnk, Вы писали:



bnk>Обычно если библиотека предназначена для внешнего использования, у нее, кроме DLL, есть еще .H и .LIB файлы (SDK), для использования разработчиками.

Обычно так и делается. А вот если их нет, то приходиться идти в обход как настоящие герои
Re[3]: Определение адреса функции в DLL
От: Evgeniy Skvortsov Россия  
Дата: 25.03.21 21:43
Оценка:
Здравствуйте, wbear, Вы писали:

bnk>>Обычно если библиотека предназначена для внешнего использования, у нее, кроме DLL, есть еще .H и .LIB файлы (SDK), для использования разработчиками.

W>Обычно так и делается. А вот если их нет, то приходиться идти в обход как настоящие герои

Кажется вся эта фигня в имени после Instance — называется деманглинг. Можно попробовать поискать, какие компиляторы какие создают имена для функций в длл.

Ну и разумеется GetProcAddress ничего об этом не знает. Ей подавай точное имя.

В общем мое имхо — проще забить чем разобраться.

Но, тот кто ищет — тот всегда найдет! Главное что бы хватило времени и денег.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.