C ++更改dll中的类,其中指向该类的指针返回给其他dll

时间:2009-07-07 10:41:00

标签: c++ dll

我知道可怕的头衔,也是一个可怕的问题。我正在使用一些软件,其中一个DLL将ptr返回给内部类。其他dll(调用dll)然后使用此指针直接调用该类的方法:

//dll 1
internalclass m_class;
internalclass* getInternalObject() {
    return &m_class;
}

//dll 2
internalclass* classptr = getInternalObject();
classptr->method();

这对我来说闻起来很糟糕,但这就是我所拥有的...我想为内部类添加一个新方法,因为其中一个调用dll需要额外的功能。我确定所有访问此类的dll都需要在包含新方法后重建,但我无法弄清楚原因的逻辑。

我的想法是它与已经编译的调用dll有关,它在另一个dll中的内部类中具有每个函数的物理地址但是我并不真正理解它;有没有人能够提供一个简洁的解释,说明dll(新内部类dll,重建调用dll和使用以前版本的内部类dll构建的dll)是如何组合在一起的?

谢谢, 帕特里克

4 个答案:

答案 0 :(得分:2)

您应该已将ptr作为基类类型返回到派生类对象。然后,您可以自由更改派生类。但是无法更改基类。

编辑:您可以稍微改变一下。但仔细。添加方法应该有效(除非它们是虚拟的)。如果在最后添加变量,添加变量可能会有效。

答案 1 :(得分:2)

不,可能不需要重建。

在幕后,internalclass :: method()将被修改成internalclass__method(internalclass* __this)之类的东西。然后,通过DLL的名称导出这个受损的函数。

答案 2 :(得分:2)

客户端dll通过查看服务dll的导出表来“学习”加载时类的函数的实际地址。因此,只要导出表保持兼容,就不会造成任何伤害。

当您的类具有虚函数表并且其中的函数更改顺序时,兼容性将被破坏。当通过序数而不是符号链接时它也会中断。

答案 3 :(得分:0)

不要触摸现有的类并在新函数中返回指向派生类的指针getInternalObject_ex()