获取DLL中导出函数的签名

时间:2008-12-22 12:20:16

标签: c++ c dll function

是否可以从DLL获取导出的(C样式?)函数的签名(参数计数/类型,返回类型)?我可以使用DLL Export Viewer查看函数名称,地址,序数等的列表,但我无法查看签名。我只有dll文件,没有.h和.def文件。

更新:使用名为API Monitor的工具,我可以附加到使用上述dll的进程并查看对函数的调用。这让我可以看到参数的数量,返回值及其整数值(指针?),但这并没有多大帮助。我可能应该找到一种方法来确定这些指针在调用时指向的结构类型。

3 个答案:

答案 0 :(得分:19)

DLL不存储它们导出的函数的签名。其他答案提到了C ++,当C ++函数导出为C ++ 时,名称确实会被破坏。使用正确的编译器修改方案对其进行解码,您将获得签名。但是大多数DLL都不使用C ++名称导出C ++函数。相反,DLL选择导出的函数是使用C风格的名称导出的,因此即使DLL是用C ++编写的,导出的函数仍然没有任何签名信息。

你没有标题?大多数供应商都在他们的SDK中包含这类内容。如果你没有得到一个,那就向卖主抱怨。如果你不应该得到一个,那么也许你会以错误的方式处理你的任务;你确定你应该直接使用那个DLL吗?

如果您没有头文件,那么您可能还会问自己,无论如何,您是否真的允许在程序中使用DLL。如果它只是您在系统上找到的任意DLL,那么即使您可以为其编写代码,也可能在发运程序时不允许重新分发它。

答案 1 :(得分:3)

在C ++中,函数签名以编译器相关的方式名称为“mangled”。这在C中不会发生。因此,如果您的DLL中有C函数,您将看到未编码的名称。如果它是C ++版本,你会看到受损的版本。

C ++需要修改名称以允许链接器解析具有不同签名的重载函数。

我认为你没有办法从“C”DLL中获取函数的特征。他们根本就不在场。

答案 2 :(得分:3)

对于C函数,此信息根本不存储在DLL中。我唯一可以建议的是反汇编函数并查看它如何与堆栈上的变量交互,然后尝试确定签名。

祝你好运!