【发布时间】:2011-01-17 16:35:36
【问题描述】:
假设您想编写一个程序来测试 c++ dll 文件中的函数。 您应该允许用户选择一个 dll(我们假设我们谈论的是 c++ dll)。 他应该能够获得 dll 导出的所有函数的列表。 然后,用户应该能够从列表中选择一个函数名称,手动输入参数列表(参数都是基本类型,如 int、double、bool 或 char 数组(例如 c 类型字符串))并尝试使用指定的参数运行选定的函数。 他想知道函数是否使用指定的参数运行,或者它们是否会导致它崩溃(例如,因为它们与签名不匹配)。
主要问题是 C++ 作为一种强类型语言,要求您在编译时知道函数调用的参数的数量和类型。就我而言,我根本不知道这些参数是什么, 直到用户在运行时选择它们。
我想出的唯一解决方案是使用汇编手动将参数推送到调用堆栈上。
但是,我已经明白,如果我想搞乱汇编,我最好确保我知道 dll 中的函数使用的是哪个调用约定。
所以(最后:)这是我的问题:我可以以编程方式推断调用约定吗? Dependency Walker 帮不了我,我也不知道如何手动读取 PE 格式。
【问题讨论】:
-
为什么不让用户也指定调用约定?默认为 stdcall(这是微软编译器现在生成的 dll 上的内容),但允许用户更改它。
-
好吧,该死的。我只是没想到!我必须检查我是否允许这样做,但如果我允许,这将是一个有效的解决方法:)))
标签: c++ dll assembly calling-convention name-decoration