运行时检查失败#0,用于运行时重新编译

时间:2018-09-29 19:19:07

标签: c++

我有一个exe,一个dll和一个静态lib。 exe和dll都取决于lib,并且dll将在运行时使用<!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>flowplayer7</title> <link rel="stylesheet" href="skin/skin.css"> <script src="flowplayer.min.js"></script> </head> <body> <div id="video"></div> <script> var video = document.getElementById("video"); flowplayer(video, { swf:'flowplayer.swf', key: '$481548029023932', width: 800, height: 450, share: false, wmode: 'opaque', clip: { sources: [ { type: 'video/flash', src: 'flash_ok.flv' }, ] } }); </script> </body> 加载到exe中。由于完整的代码太长,下面是简化版本。

LoadLibrary

lib

struct base{ virtual void update() = 0; }; std::vector<base*> container;

dll

struct derived : public base { void update() override {} }; //some functions to instantiate derived class and push into container

exe

我想做的是能够更改派生类(将不止一个),并能够在运行时将dll更新后的内容加载回去。

在我更改int main() { while(true) { for (const auto & elem : container) elem->update(); //keep on updating } } 函数内部的内容并重新编译并重新加载dll之前,它可以正常工作。如果我重新编译并加载而不更改任何内容,则不会出现运行时错误。

我尝试删除容器内的所有元素,并在重新编译并重新加载dll时再次使用“更新的”派生类进行回退,但错误仍然存​​在。但是,如果不删除容器中的所有元素而不推送新的派生类,就不会出现运行时错误。

完整的错误文本为derived::update()

1 个答案:

答案 0 :(得分:0)

执行此操作的唯一(如果不是唯一的)方法之一是在卸载DLL之前仔细删除对DLL的所有引用。

  1. 销毁container中的所有对象(保存足够的适当数据以便以后(可能通过序列化)重建它们)
  2. 卸载DLL,
  3. 加载新的DLL(可能位于不同的地址,和/或其中的数据和功能具有不同的偏移量)
  4. 重建您的container对象。