gpt4 book ai didi

c++ - 重新编译 MFC 扩展 DLL 更改导出函数的入口点

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:55 34 4
gpt4 key购买 nike

我有一个导出 C++ 类的 MFC 扩展 DLL,我需要修改类方法的行为。这些更改不会影响类方法的签名。

我不想重新编译使用该库先前发布版本的“lib”文件的模块。

如果更改修改了函数的入口点地址会怎样?

比如构造函数的地址变了:

Export   Ordinal      Function    Hint                      Entry Point
[+ ] 3 (0x0003) 2 (0x0002) ??0CLangManager@@QAE@XZ 0x00009CB0 (OLD DLL)
[+ ] 3 (0x0003) 2 (0x0002) ??0CLangManager@@QAE@XZ 0x00009760 (NEW DLL)

我是否应该重新编译使用该库的模块?

我使用已发布的可执行文件测试了重新编译的库 - 使用新的入口点,一切正常。我不确定这种情况是否隐藏了一些副作用。

什么时候需要重新编译链接到 DLL 的可执行文件?

二进制兼容性何时会被破坏?

最佳答案

这是使用 DLL 的好处之一 - 您可以更改它,只要您继续保持相同的函数签名,一切都会正常工作。加载程序时会发生链接,因此更改地址不会产生任何影响。

您需要绝对肯定 DLL 中定义的任何类都没有任何内联方法,因为这些方法可能不适用于对象的任何内部更改。

当函数签名更改时,或者当公共(public)成员变量更改对象内的位置时,二进制兼容性就会被破坏。我会完全避免 DLL 中的公共(public)成员变量。

编辑:如评论中所述,如果在类中添加或删除变量,改变其大小,您也会遇到麻烦。如果对象是在 DLL 外部创建的,无论是作为局部变量还是通过 new 创建,这都会成为一个问题。您可以通过从 DLL 内部创建所有对象实例并将指针传递给调用者来避免这种情况。您还可以通过使用 PIMPL idiom 来避免问题。在你的课上。

关于c++ - 重新编译 MFC 扩展 DLL 更改导出函数的入口点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15027912/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com