【问题标题】:Call DLLs dynamically C++动态调用 DLL C++
【发布时间】:2015-08-06 04:18:15
【问题描述】:

我必须用 C++ 制作一个 DLL 时间测试程序,它可以加载 DLL 并尝试它们的功能,测试是否给出正确的结果并检查运行它们所需的时间。 所以这意味着我将在我的程序执行期间收到一个 DLL 或不同的 DLL,加载它们并调用它们的函数,而不知道函数有多少参数(在编译我的程序之前)。

所以我知道我不能声明指向 GetProcAddress 需要的函数的指针,除非我动态声明(我不知道我是否可以在 c++ 中这样做)。 既不动态包含 DLL 的标头。

我能找到的唯一解决方案是我的程序生成一个新的 c 或 c++ 文件,其中包含调用 DLL 函数、编译、启动它所必需的所有东西......

你能给我意见和想法吗,也许在 C++ 中有一种方法可以做到这一点,我正在跳过它。

我正在使用 C++,代码块 13.12 和 MinWG 4.8。

【问题讨论】:

  • 听起来你是对的,在编译语言中,我没有看到比动态代码生成更简洁的替代方案。
  • 您会以什么形式收到有关如何调用函数的说明?假设您需要测试一个接收两个char* 的函数。你应该怎么做?
  • 程序可以访问函数名、索引、参数、返回类型的所有信息。但只有在编译之后。我只需要运行该函数来获取结果(用户将检查它是否正确)并检查调整它所花费的时间。这项工作对于解释语言来说听起来更好,但他们要求我使用 c++ 工作:S
  • 查看 Python。它有一个模块来加载 DLL (docs.python.org/3/library/ctypes.html) 并调用它们的函数,显然之前没有任何关于它们的知识。这意味着那里可以使用低级接口以及如何传递参数。现在,您可以直接使用 Python(或至少构建一个原型),也可以阅读源代码以了解如何操作。附近:Python 也有一个用于计时事物持续时间的模块,这将节省您另外几个步骤。
  • “可以访问所有信息”。以什么形式?实际调用需要两个 char* 参数的函数应该有哪些信息?

标签: c++ dll


【解决方案1】:

这个问题有两种基本的解决方案。

1) 即时填写所有可能的函数,然后在调用函数时,可以选择正确的模板并填写详细信息。

2) 动态生成代码。

1) 并不像听起来那么难,因为有大量功能相同的函数。两个函数可以满足所有的0参数函数(stdcall + cdecl)。 2个函数用于一个参数调用,依此类推。正确的数据(例如指针和大小)被别名为指针 1、指针 2,然后传递给通用函数 void * Func1_2params( void*,void*); - 这可能符合 void func1( char, char);, int strtok( char *, char *);, ... 因为每个参数元素的槽(reg/stack)是“指针大小”的调用约定

2) 有一个库 ffi(外文形式接口) - 它将脚本语言绑定到 C/C++,可用于动态构建代码以创建正确的接口,这不是很直接,但是有可能让它发挥作用。最后,一些脚本语言有直接调用(java、luajit)。将luajit嵌入到你的代码中会相对容易,并使用少量的lua构建一个从函数的“lua视图”到native的调用站点,然后调用一个DLL。

【讨论】:

  • 谢谢!,这确实减少了选项,也许我可以设置接受的最大参数。如果我想得到函数的结果?,只需从 void* 转换为正确的类型就可以了吗?示例: typedef void* (* Myfunc) (void * ,void *); ....... Myfunc myfunc(0);.... int n=(int)(myfunc)(db,something);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多