繁体   English   中英

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

[英]C++ Changing a class in a dll where a pointer to that class is returned to other dlls

我知道可怕的标题,也是一个可怕的问题。 我正在使用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的先前版本构建的dll)如何组合在一起的简要说明吗?

谢谢,帕特里克

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

编辑:您可能可以对其进行一些更改。 但是要小心。 添加方法应该起作用(除非它们是虚拟的)。 如果在末尾添加变量,则添加变量可能会起作用。

不,可能不需要重建。

在幕后,internalclass :: method()将被internalclass__method(internalclass* __this)成诸如internalclass__method(internalclass* __this) 然后,将按名称从DLL中导出此错误的函数。

客户端dll在加载时通​​过查看服务dll的导出表来“了解”该类的实际地址”。 因此,只要导出表保持兼容,就不会造成任何损害。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM