从DLL实例化子类时,vtable是否正确?

时间:2014-01-15 07:33:16

标签: c++ windows dll dynamic-library

如果在主要可执行文件和DLL中定义的子类(比如插件)中有基类,那么当您想要获取插件时会发生什么?

我正在寻找一篇文章/答案,澄清当你

时会发生什么
  • 加载DLL
  • 调用DLL的函数,该函数返回plugin*(它具有虚函数)
  • 在主要可执行文件的代码中使用该插件
  • 删除,卸载

我正在考虑vtable和其他C ++问题。例如,如果你卸载运行了一些插件的DLL stil ......“代码”将会消失吗?

1 个答案:

答案 0 :(得分:2)

由于您在谈论插件,因此您必须执行LoadLibrary之类的操作。假设Windows:

  • 加载库。您通常会调用LoadLibrary,然后调用GetProcAddress。 DLL被加载到进程地址空间,你有指向暴露函数的指针。
  • 调用DLL的函数,返回plugin*(它具有虚函数)。您可以将GetProcAddress的返回值强制转换为函数指针类型,然后调用它。一切都应该正常工作。
  • 在主可执行文件的代码中使用该插件。没什么特别的。
  • 删除插件。我假设您在DLL中使用了一个函数来执行此操作,它应该没问题。直接调用delete可能很危险,因为DLL可能有一个单独的内存管理器(取决于你使用的运行时)。
  • 卸载DLL。你打电话给FreeLibrary,代码就消失了。您之前从GetProcAddress获得的指针无效。

我不知道具体的vtable问题。如果在代码仍在运行时卸载DLL,我会假设程序将在此时崩溃,因为代码地址空间无效。