【问题标题】:DLL load and call class methodDLL加载和调用类方法
【发布时间】:2020-09-16 06:02:35
【问题描述】:

要在 VC++ 中加载 DLL 并调用函数,我们使用 LoadLibrary 和 GetProcAddress ,这需要方法名的错位。它是否实例化一个类对象然后调用该方法?

如果没有,那我如何调用类中的方法,但实例化类的对象,然后调用方法?

VC++中加载.h文件、加载类、实例化对象然后调用方法的过程是什么

【问题讨论】:

  • 底层的 C++ 方法只是带有第一个 this 参数的函数。
  • 我正在尝试编写一个代码,该代码将在运行时询问 DLL 文件的名称和要执行的函数的名称。所以我需要实例化一个类运行时并创建对象并使用该对象来调用该函数。这可能吗?
  • 注意:我对 C++ 内部结构不是很熟悉,所以这些只是我的想法。我认为是的,你可以这样做,但由于 C++ 没有标准化的 ABI,每个编译器都可以(并且确实)将类方法和字段定位在不同的偏移量处。在特定的编译器版本中,如果您有类定义,这可能会起作用。
  • 使用代码 sn-p 指向它的任何指针?这真的很有帮助。
  • @Joulukuusi - 你的第一条评论,C++ 构造函数没有this 参数,因为在构造之前没有没有this

标签: visual-c++ dll


【解决方案1】:

实际上有一个very good example on CodeProject 准确描述了如何执行此操作。

EDIT 参考您的评论,如果您阅读上述文章,您会发现GetProcAddress() 只是返回一个函数指针。如果要创建从 DLL 导出的 class 的实例,则必须分配内存并强制系统调用类的构造函数以在此处实例化它。但是,一旦完成,我有点假设您可以使用刚刚创建的对象以正常方式调用类中定义的函数。

【讨论】:

  • 嗨,但我有一个非常基本的问题。假设 DLL A.dll 已导出,Class A{ public function B(){//some code} } 是否 LoadLibrary、GetProcAddress 实例化 Class A 并创建对象 A,然后为 object A.B() 返回函数指针?
  • 编辑答案以解决您的评论 - 见上文。
  • 很好,但不幸的是 MSVC 的 __asm 仅适用于 x86 并且不支持 asm 关键字。无论如何都要为有趣的阅读 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多