Get signatures of exported functions in a DLL(获取 DLL 中导出函数的签名)
问题描述
是否可以从 DLL 中获取导出的(C 风格?)函数签名(参数计数/类型、返回类型)?我可以使用 DLL 导出查看器查看函数名称、地址、序号等列表但是我看不到签名.我只有 dll 文件,没有 .h 和 .def 文件.
Is it possible to get an exported (C style?) function's signature (parameter count/types, return type) from a DLL? I can view the list of function names, addresses, ordinals, etc. with DLL Export Viewer but I can't view the signatures. I only have the dll file and don't have neither .h nor .def files.
更新:使用名为 API Monitor 的工具,我可以附加到使用提到的 dll 的进程并查看对函数的调用.这让我可以看到参数的数量、返回值及其整数值(指针?),但这并没有多大帮助.我可能应该找到一种方法来确定这些指针在调用时指向的结构类型.
UPDATE: Using a tool called API Monitor, I can attach to a process that uses the mentioned dll and see the calls to the functions. This lets me to see the number of parameters, return value and their integer values (pointers?) but this doesn't help a lot. I probably should find a way to determine what type of structures those pointers are pointing to at the call time.
推荐答案
DLL 不存储它们导出的函数的签名.其他答案提到了 C++,当一个 C++ 函数被导出为 C++ 时,这个名字确实会被破坏.使用正确的编译器的重整方案对其进行破坏,您将获得签名.但是大多数 DLL 不使用它们的 C++ 名称导出 C++ 函数.相反,DLL 选择导出的函数是使用 C 样式名称导出的,因此即使 DLL 是用 C++ 编写的,导出的函数仍然不会有任何签名信息.
DLLs do not store the signatures of the functions they export. Other answers have mentioned C++, and when a C++ function is exported as C++, then the name will indeed be mangled. Demangle it with the right compiler's mangling scheme, and you'll have the signature. But most DLLs do not export C++ functions using their C++ names. Instead, the functions a DLL chooses to export are exported using C-style names, so even if the DLL was written in C++, the exported functions still won't have any signature information.
你没有标题?大多数供应商都在他们的 SDK 中包含了这种东西.如果你没有得到一个,然后向供应商投诉.如果你不应该得到一个,那么你可能会以错误的方式完成你的任务;你确定你应该直接使用那个 DLL 吗?
You don't have the header? Most vendors include that sort of thing in their SDKs. If you didn't get one, then complain to the vendor. If you weren't supposed to get one, then maybe you're going about your task the wrong way; are you sure you're supposed to use that DLL directly?
如果您没有头文件,那么您可能还会问自己是否真的被允许合法地在您的程序中使用 DLL.如果它只是您在系统上找到的任意 DLL,那么即使您可以为它编写代码,也可能不允许您在发布程序时重新分发它.
If you do not have the header file, then you might also ask yourself whether you're really allowed, legally, to use the DLL in your program anyway. If it's just an arbitrary DLL you found on your system, then even if you can write code for it, you're probably not allowed to redistribute it when you ship your program.
这篇关于获取 DLL 中导出函数的签名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:获取 DLL 中导出函数的签名
基础教程推荐
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 从 std::cin 读取密码 2021-01-01