【问题标题】:How to call a function with types known at runtime如何调用运行时已知类型的函数
【发布时间】:2020-08-23 21:13:35
【问题描述】:

加载动态库和GetProcAddress 后,通常会获得void* 类型的函数指针。要调用该函数,在编译时执行此操作时,会将指针转换为所需的正确指针类型。

但是,如果在编译时不知道类型,而是在运行时知道,则类型的可能性有很多。在这种情况下,似乎需要手动“调用”函数,也就是根据 ABI 更新堆栈和寄存器。

问题是:在通用平台和 ABI 中是否有任何开源代码可以解决这个问题?如果没有,我如何自己实现?

微软的 abi 文档有一些关于 cdecl 和其他约定的东西,看起来 32 位和 64 位是不同的。 Linux 上的 ABI 是一样的还是其他?

【问题讨论】:

  • 如果类型未知,则应该将其视为void *。除非您知道它是什么,或者除非您将它传递给执行此操作的函数,否则您无法对返回值做任何明智的事情。一般来说,如果你遇到这个问题,我认为你可能有一个设计问题。更新堆栈等不是 C 开发人员的问题。你不应该遇到任何麻烦。
  • 您能否提供一个遇到此问题的示例?
  • Linux 上的 ABI 与 Windows 上的不同,你可以在this Wikipedia page 底部看到一个表格(假设你说的是 x86)。
  • @Cheatah 我知道执行任意代码很危险,但是假设您希望您的用户使用命令行执行他/他编写并编译成 dll 的内容,并使用命令行中给出的参数在运行时。
  • @Cheatah 这样一来,虽然C装饰dll中缺少类型信息,但是编译时不知道怎么使用里面的函数。

标签: c++ c reflection runtime shared-libraries


【解决方案1】:

在另一个答案中,我说https://dyncall.org/ 看起来是需要的。

该答案已被删除,尽管 cmets 表示它是正确的。在这里重新发布信息以防其他人需要。

【讨论】:

    猜你喜欢
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多