我有一个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()
答案 0 :(得分:0)
执行此操作的唯一(如果不是唯一的)方法之一是在卸载DLL之前仔细删除对DLL的所有引用。
container
中的所有对象(保存足够的适当数据以便以后(可能通过序列化)重建它们)container
对象。