Получить подписи экспортируемых функций в DLL - PullRequest
19 голосов
/ 22 декабря 2008

Можно ли получить подпись экспортированной (в стиле C) функции (число параметров / типы, тип возвращаемого значения) из DLL? Я могу просмотреть список имен функций, адресов, порядковых номеров и т. Д. С помощью DLL Export Viewer , но не могу просмотреть подписи. У меня есть только файл DLL и нет файлов .h и .def.

ОБНОВЛЕНИЕ: Используя инструмент под названием API Monitor , я могу подключиться к процессу, использующему упомянутую DLL, и посмотреть вызовы функций. Это позволяет мне видеть количество параметров, возвращаемое значение и их целочисленные значения (указатели?), Но это не очень помогает. Я, вероятно, должен найти способ определить, на какие структуры указывают указатели во время вызова.

Ответы [ 3 ]

19 голосов
/ 22 декабря 2008

DLL не хранят сигнатуры экспортируемых ими функций. В других ответах упоминается C ++, и когда функция C ++ экспортируется как C ++ , тогда имя действительно будет искажено. Разоберите его с помощью правильной схемы компиляции, и вы получите подпись. Но большинство DLL не экспортируют функции C ++, используя их имена C ++. Вместо этого функции, которые DLL выбирает для экспорта, экспортируются с использованием имен в стиле C, поэтому даже если DLL была написана на C ++, экспортированные функции по-прежнему не будут иметь никакой информации о подписи.

У вас нет заголовка? Большинство поставщиков включают подобные вещи в свои SDK. Если вы не получили его, то пожаловаться продавцу. Если вы не должны были получить его, то, возможно, вы выполняете свою задачу неправильно; Вы уверены, что должны использовать эту DLL напрямую?

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

3 голосов
/ 22 декабря 2008

Для функций C эта информация вообще не хранится в DLL. Единственное, что я могу предложить, - это разобрать функцию и посмотреть, как она взаимодействует с переменными в стеке, а затем попытаться определить подпись.

Удачи!

3 голосов
/ 22 декабря 2008

В C ++ сигнатуры функций " искалечены " в имя, зависящее от компилятора. Этого не происходит в C. Итак, если у вас есть функции C в вашей DLL, вы увидите не исправленные имена. Если это C ++, вы увидите искаженные.

C ++ нужны искаженные имена, чтобы компоновщик мог разрешать перегруженные функции с разными сигнатурами.

Я не думаю, что у вас есть какой-либо способ получить характеристики функции из "C" DLL. Их просто нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...